Load occurrence dataset

Occurrences and lineages through time

Raw data

OTT measures the number of occurrences at each time point directly from their ages. expertLTT and empiricalLTT capture lineage counts, with the former based on speciation and extinction dates, while the latter depends on observations (first and last appearances).

Plot the number of occurrences and lineages through time

Standardized counts and subsampling

Standardize the number of occurrences by the number of lineages, and subsample to erase the sampling bias. Subsampling is done by calculating the probability for each row, interpolating for time points between values, and subsampling accordingly.

               0    10    20    30    40    50    60   70
triton    260000 77000 25000 19000 17000 13000 11000 2600
triton.ss  16000 24000 20000 17000 16000 13000  9200 1100

One problem with this method is that it requires having a comprehensive and reliable estimate of the number of lineages through time from experts, which is not available for most clades.

Geographic subsampling

Null model of fossil sampling based on plate technotics

This part processes plate tectonic data to model water depths over the Cenozoic.

Geographic null model: Uniform sampling of marine points from each depth raster in cells deeper than 200m, drawing in each bin the same number of occurrences as in Triton, to simulate random sampling of fossils across the Cenozoic.

Null distributions of latitude and longitude for the uniformly sampled fossils, allowing a comparison of uniform fossil sampling with actual fossil occurrences.

Let’s subsample by optimizing the sampling probability based on deviations from the expected distributions over time, latitude and longitude.

[1] "Iteration: 1"
[1] "Iteration: 2"
[1] "Iteration: 3"
[1] "Iteration: 4"
[1] "Iteration: 5"
[1] "Iteration: 6"
[1] "Iteration: 1"
[1] "Iteration: 2"
[1] "Iteration: 3"
[1] "Iteration: 4"
[1] "Iteration: 5"
[1] "Iteration: 6"
[1] "Iteration: 7"
[1] "Iteration: 8"
[1] "Iteration: 9"
[1] "Iteration: 1"
[1] "Iteration: 2"
[1] "Iteration: 3"
[1] "Iteration: 4"
[1] "Iteration: 5"
                 0    10    20    30    40    50    60   70
triton      260000 77000 25000 19000 17000 13000 11000 2600
triton.ss6   15000 26000 18000 17000 14000 13000  8600  650
triton.ss15   2300  3400  2300  1900  2000  1900  1300   59
triton.ss20    570   850  1000   600   750   720   450    7

This method reduces the temporal and geographical biases, but requires again to know the expected temporal richness trajectory. Let’s try a subsampling method that does not use this information.

Hole-based subsampling

In this section, we aim to reduce sampling biases in our dataset by performing subsampling based on drilling holes (locations where fossils were collected). The goal is to achieve a more uniform sampling effort across different holes and through time.

Calculating Occurrence Density per Hole

This plot highlights holes with unusually high densities that may introduce sampling bias.

Subsample at the Sediment Sample level

In this section, we focus on subsampling at the sample level to reduce sampling biases by homogenizing the number of sediment samples per hole through time. This method aims to create a more balanced dataset by adjusting for overrepresented holes and time periods.

Visualizing the Occurrence Density per Sample and the Sample Density per Hole

  • HoleNbSample: Number of unique samples collected from each hole.
  • HoleDtySample: Density of samples per hole, adjusted for the duration of sampling at each hole.
  • STT: Number of samples collected at each time point.

The mean number of occurrences per sample looks much more like the distribution of species over time. Let’s look at this quantity directly.

  • SpHTT = Samples per hole through time
  • OpSTT = Occurrences per sample through time

Subsampling - Homogenize the Number of Samples Through Time (ss.STT)

quartz_off_screen 
                2 
quartz_off_screen 
                2 

The number of occurrences after subsampling reflects very well the number of lineages designed by experts.

Check spatial biases

Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     

Compare to simulated homogeneous sampling

Save objects

LS0tCnRpdGxlOiAiU3Vic2FtcGxpbmcgdGhlIFRyaXRvbiBkYXRhc2UgLSBUZW1wb3JhbCByYXJlZmFjdGlvbiIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UpCmBgYAoKYGBge3IgaW5jbHVkZT1GQUxTRX0KbGlicmFyeSgiZ2dwbG90MiIpCmxpYnJhcnkoInJhc3RlciIpCmxpYnJhcnkoInRlcnJhIikKYGBgCgojIExvYWQgb2NjdXJyZW5jZSBkYXRhc2V0CgpgYGB7cn0KdHJpdG9uIDwtIHJlYWQuY3N2KCIuLi8uLi8zLURhdGFfcHJvY2Vzc2VkL1RyaXRvbl9vY2N1cnJlbmNlcy9Ucml0b25EQl90cmltbWVkX3J1bmlmLmNzdiIsIHJvdy5uYW1lcz0xKQpgYGAKCiMgT2NjdXJyZW5jZXMgYW5kIGxpbmVhZ2VzIHRocm91Z2ggdGltZQojIyBSYXcgZGF0YQoKYE9UVGAgbWVhc3VyZXMgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBhdCBlYWNoIHRpbWUgcG9pbnQgZGlyZWN0bHkgZnJvbSB0aGVpciBhZ2VzLiBgZXhwZXJ0TFRUYCBhbmQgYGVtcGlyaWNhbExUVGAgY2FwdHVyZSBsaW5lYWdlIGNvdW50cywgd2l0aCB0aGUgZm9ybWVyIGJhc2VkIG9uIHNwZWNpYXRpb24gYW5kIGV4dGluY3Rpb24gZGF0ZXMsIHdoaWxlIHRoZSBsYXR0ZXIgZGVwZW5kcyBvbiBvYnNlcnZhdGlvbnMgKGZpcnN0IGFuZCBsYXN0IGFwcGVhcmFuY2VzKS4KCmBgYHtyfQp0aW1lX3BvaW50cyA8LSAwOjMzMC81CiN0aW1lX3BvaW50cyA8LSAwOjY2Ck9UVCA8LSBzYXBwbHkodGltZV9wb2ludHMsIGZ1bmN0aW9uKHRpKXN1bShhYnModHJpdG9uJGFnZV9ydW5pZiAtIHRpKSA8PSBkaWZmKHRpbWVfcG9pbnRzKVsxXS8yKSkKZXhwZXJ0TFRUIDwtIHNhcHBseSh0aW1lX3BvaW50cywgZnVuY3Rpb24odGkpbGVuZ3RoKHVuaXF1ZSh0cml0b25bdHJpdG9uJFNwZWNpYXRpb24gPj0gdGkgJiB0aSA+PSB0cml0b24kRXh0aW5jdGlvbixdJHNwZWNpZXMpKSkKZW1waXJpY2FsTFRUIDwtIHNhcHBseSh0aW1lX3BvaW50cywgZnVuY3Rpb24odGkpbGVuZ3RoKHVuaXF1ZSh0cml0b25bYWJzKHRyaXRvbiRhZ2VfcnVuaWYgLSB0aSkgPD0gZGlmZih0aW1lX3BvaW50cylbMV0vMixdJHNwZWNpZXMpKSkKYGBgCgpQbG90IHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgYW5kIGxpbmVhZ2VzIHRocm91Z2ggdGltZQoKYGBge3IgZmlnLmFzcD0wLjMsIGZpZy53aWR0aD0xMn0KcGFyKG1mcm93PWMoMSwzKSkKcGxvdCh0aW1lX3BvaW50cywgT1RULCB0eXBlPSJsIiwgbWFpbj0iRGlzdHJpYnV0aW9uIG9mIG9jY3VycmVuY2VzIHRocm91Z2ggdGltZSIsIGNvbD0iZG9kZ2VyYmx1ZTQiKQpwb2ludHModGltZV9wb2ludHMsIE9UVCwgcGNoPTE5LCBjZXg9MC41LCBjb2w9ImRvZGdlcmJsdWU0IikKcGxvdCh0aW1lX3BvaW50cywgZXhwZXJ0TFRULCB0eXBlPSJsIiwgeWxpbT1jKDAsMTIwKSwgY29sPSJvcmNoaWQ0IiwgbWFpbj0iTnVtYmVyIG9mIGxpbmVhZ2VzIHRocm91Z2ggdGltZSIpCnBvaW50cyh0aW1lX3BvaW50cywgZXhwZXJ0TFRULCBwY2g9MTksIGNleD0wLjUsIGNvbD0ib3JjaGlkNCIpCnBsb3QodGltZV9wb2ludHMsIGVtcGlyaWNhbExUVCwgdHlwZT0ibCIsIHlsaW09YygwLDEyMCksIG1haW49Ik51bWJlciBvZiBvYnNlcnZlZCBsaW5lYWdlcyB0aHJvdWdoIHRpbWUiLCBjb2w9InBsdW0zIikKcG9pbnRzKHRpbWVfcG9pbnRzLCBlbXBpcmljYWxMVFQsIHBjaD0xOSwgY2V4PTAuNSwgY29sPSJwbHVtMyIpCmxpbmVzKHRpbWVfcG9pbnRzLCBleHBlcnRMVFQsIGNvbD0ib3JjaGlkNCIsIGx3ZD0yKQpgYGAKCiMjIFN0YW5kYXJkaXplZCBjb3VudHMgYW5kIHN1YnNhbXBsaW5nCgpTdGFuZGFyZGl6ZSB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIGJ5IHRoZSBudW1iZXIgb2YgbGluZWFnZXMsIGFuZCBzdWJzYW1wbGUgdG8gZXJhc2UgdGhlIHNhbXBsaW5nIGJpYXMuIFN1YnNhbXBsaW5nIGlzIGRvbmUgYnkgY2FsY3VsYXRpbmcgdGhlIHByb2JhYmlsaXR5IGZvciBlYWNoIHJvdywgaW50ZXJwb2xhdGluZyBmb3IgdGltZSBwb2ludHMgYmV0d2VlbiB2YWx1ZXMsIGFuZCBzdWJzYW1wbGluZyBhY2NvcmRpbmdseS4KCmBgYHtyIGZpZy5hc3A9MC4zLCBmaWcud2lkdGg9NX0Kc09UVCA8LSBPVFQvZW1waXJpY2FsTFRUICAgICAgICAgICAgICAgICAgICAgICAgICMgTFRULXN0YW5kYXJkaXplZCBvY2N1cnJlbmNlcyB0aHJvdWdoIHRpbWUKbmFtZXMoc09UVCkgPC0gdGltZV9wb2ludHMKaW50ZXJwb2xhdGVfY3VydmUgPC0gZnVuY3Rpb24oeF9ncmlkLCB4LCB5KXsKICBjbG9zZXN0X3ggPC0geF9ncmlkW29yZGVyKGFicyh4X2dyaWQteCkpXVsxOjJdCiAgeDEgPC0gY2xvc2VzdF94WzFdCiAgeDIgPC0gY2xvc2VzdF94WzJdCiAgeTEgPC0geVt4X2dyaWQ9PXgxXQogIHkyIDwtIHlbeF9ncmlkPT14Ml0KICByZXR1cm4gKHkxICsgKHkyLXkxKSooeC14MSkvKHgyLXgxKSkgICAgIyBsaW5lYXIgaW50ZXJwb2xhdGlvbgogICMgcmV0dXJuICh5MSAqICh5Mi95MSkqKigoeC14MSkvKHgyLXgxKSkpICAgICMgZXhwb25lbnRpYWwgaW50ZXJwb2xhdGlvbgogICMgcmV0dXJuIChpZmVsc2UoeTE8eTIsIHkxICsgKDEreTIteTEpKiooKHgteDEpLyh4Mi14MSkpIC0gMSwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkyICsgKDEreTEteTIpKiooKHgteDIpLyh4MS14MikpIC0gMSkpICAgICMgYWx0ZXJuYXRpdmUgZXhwb25lbnRpYWwgaW50ZXJwb2xhdGlvbgp9CnNPVFRfcmVmIDwtIHJvdW5kKHF1YW50aWxlKHNPVFQsIDAuNSwgbmEucm09VCkpICAjIHRoZSByZWZlcmVuY2UgbmIgb2Ygb2NjdXJyZW5jZXMgcGVyIGxpbmVhZ2UgdXNlZCBmb3Igc3Vic2FtcGxpbmcKCnNhbXBsaW5nX3Byb2JhIDwtIGZ1bmN0aW9uKHRyaXRvbl9yb3cpewogIGFnZV9yYXRpbyA8LSBpbnRlcnBvbGF0ZV9jdXJ2ZSh4X2dyaWQ9dGltZV9wb2ludHMsIHg9YXMubnVtZXJpYyh0cml0b25fcm93W1siYWdlX3J1bmlmIl1dKSwgeT1zT1RUX3JlZi9zT1RUKQogIHJldHVybihtaW4oYWdlX3JhdGlvLCAxKSkKfQoKdHJpdG9uLnNzIDwtIHRyaXRvblthcy5sb2dpY2FsKHJiaW5vbShuPW5yb3codHJpdG9uKSwgc2l6ZT0xLCBwcm9iPWFwcGx5KHRyaXRvbiwgMSwgc2FtcGxpbmdfcHJvYmEpKSksXQoKcmJpbmQodHJpdG9uID0gICAgc2lnbmlmKHRhYmxlKGFzLmZhY3Rvcihyb3VuZCh0cml0b24kYWdlX3J1bmlmLzEwKSoxMCkpLCAyKSwgCiAgICAgIHRyaXRvbi5zcyA9IHNpZ25pZih0YWJsZShhcy5mYWN0b3Iocm91bmQodHJpdG9uLnNzJGFnZV9ydW5pZi8xMCkqMTApKSwgMikpCmBgYAoKYGBge3IgZmlnLmFzcD0wLjQsIGZpZy53aWR0aD0xMn0KT1RULnNzIDwtIHNhcHBseSh0aW1lX3BvaW50cywgZnVuY3Rpb24odGkpc3VtKGFicyh0cml0b24uc3MkYWdlX3J1bmlmIC0gdGkpIDw9IGRpZmYodGltZV9wb2ludHMpWzFdLzIpKQojT1RUIDwtIHNhcHBseSh0aW1lX3BvaW50cywgZnVuY3Rpb24odGkpc3VtKCh0cml0b24uc3MkU3BlY2lhdGlvbiA+PSB0aSAmIHRpID49IHRyaXRvbi5zcyRFeHRpbmN0aW9uKS8odHJpdG9uLnNzJFNwZWNpYXRpb24tdHJpdG9uLnNzJEV4dGluY3Rpb24pKSkKZXhwZXJ0TFRULnNzIDwtIHNhcHBseSh0aW1lX3BvaW50cywgZnVuY3Rpb24odGkpbGVuZ3RoKHVuaXF1ZSh0cml0b24uc3NbdHJpdG9uLnNzJFNwZWNpYXRpb24gPj0gdGkgJiB0aSA+PSB0cml0b24uc3MkRXh0aW5jdGlvbixdJHNwZWNpZXMpKSkKZW1waXJpY2FsTFRULnNzIDwtIHNhcHBseSh0aW1lX3BvaW50cywgZnVuY3Rpb24odGkpbGVuZ3RoKHVuaXF1ZSh0cml0b24uc3NbYWJzKHRyaXRvbi5zcyRhZ2VfcnVuaWYgLSB0aSkgPD0gZGlmZih0aW1lX3BvaW50cylbMV0vMixdJHNwZWNpZXMpKSkKYGBgCgoKYGBge3IgZmlnLmFzcD0wLjQsIGZpZy53aWR0aD0xMn0KcGFyKG1mcm93PWMoMSwyKSkKcGxvdCh0aW1lX3BvaW50cywgT1RUL2VtcGlyaWNhbExUVCwgbG9nPSJ5IiwgeWxpbT1jKDEsMTAwMCksIHR5cGU9ImwiLCBjb2w9ImRvZGdlcmJsdWU0IiwgbWFpbj0iTnVtYmVyIG9mIG9jY3VycmVuY2VzIHBlciBsaW5lYWdlIHRocm91Z2ggdGltZSIpCnBvaW50cyh0aW1lX3BvaW50cywgT1RUL2VtcGlyaWNhbExUVCwgcGNoPTE5LCBjZXg9MC41LCBjb2w9ImRvZGdlcmJsdWU0IikKbGluZXModGltZV9wb2ludHMsIHJlcChzT1RUX3JlZiwgbGVuZ3RoKHRpbWVfcG9pbnRzKSkpCnBsb3QodGltZV9wb2ludHMsIE9UVC5zcy9lbXBpcmljYWxMVFQsIGxvZz0ieSIsIHlsaW09YygxLDEwMDApLCB0eXBlPSJsIiwgY29sPSJwYWxlZ3JlZW40IiwgbWFpbj0iTnVtYmVyIG9mIG9jY3VycmVuY2VzIHBlciBsaW5lYWdlIHRocm91Z2ggdGltZSIpCnBvaW50cyh0aW1lX3BvaW50cywgT1RULnNzL2VtcGlyaWNhbExUVCwgcGNoPTE5LCBjZXg9MC41LCBjb2w9InBhbGVncmVlbjQiKQpsaW5lcyh0aW1lX3BvaW50cywgcmVwKHNPVFRfcmVmLCBsZW5ndGgodGltZV9wb2ludHMpKSkKYGBgCgpPbmUgcHJvYmxlbSB3aXRoIHRoaXMgbWV0aG9kIGlzIHRoYXQgaXQgcmVxdWlyZXMgaGF2aW5nIGEgY29tcHJlaGVuc2l2ZSBhbmQgcmVsaWFibGUgZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiBsaW5lYWdlcyB0aHJvdWdoIHRpbWUgZnJvbSBleHBlcnRzLCB3aGljaCBpcyBub3QgYXZhaWxhYmxlIGZvciBtb3N0IGNsYWRlcy4KCiMgR2VvZ3JhcGhpYyBzdWJzYW1wbGluZwojIyBOdWxsIG1vZGVsIG9mIGZvc3NpbCBzYW1wbGluZyBiYXNlZCBvbiBwbGF0ZSB0ZWNobm90aWNzCgpUaGlzIHBhcnQgcHJvY2Vzc2VzIHBsYXRlIHRlY3RvbmljIGRhdGEgdG8gbW9kZWwgd2F0ZXIgZGVwdGhzIG92ZXIgdGhlIENlbm96b2ljLgoKYGBge3IgZmlnLmFzcD0wLjQsIGZpZy53aWR0aD0xMn0KYWdlcyA8LSBnc3ViKCIuKl98LnRpZiIsICIiLCBsaXN0LmZpbGVzKCIuLi8uLi8xLURhdGFfcmF3L0Nlbm96b2ljX2RlcHRoX3Jhc3RlcnMvIikpCiMgY29kZSBmb3IgZXh0cmFjdGluZyB3YXRlciBkZXB0aHMKZm9yIChhZ2UgaW4gYWdlc1sxKzA6Zmxvb3IobGVuZ3RoKGFnZXMpLzUtMSkqNV0pewogIGN1dG9mZi5ycyA8LSBicmljayhwYXN0ZTAoIi4uLy4uLzEtRGF0YV9yYXcvQ2Vub3pvaWNfZGVwdGhfcmFzdGVycy9zY290X2V4dHJhcF9DZW5vXyIsIGFnZSwgIi50aWYiKSkKICBjdXRvZmYucnNbY3V0b2ZmLnJzIDwgMjAwXSA8LSBOQSAjIGV4Y2x1ZGUgdGhvc2Ugc2hhbGxvd2VyIHRoYW4gMjAwbQogIHBuZyhwYXN0ZTAoIi4uLy4uLzMtRGF0YV9wcm9jZXNzZWQvQ2Vub3pvaWNfZGVwdGhfcmFzdGVyc19wbG90cy9zY290X2V4dHJhcF9DZW5vXyIsIGFnZSwgIi5wbmciKSkKICBwbG90KGN1dG9mZi5ycywgbWFpbj1wYXN0ZShhZ2UsICJtaWxsaW9ucyB5ZWFycyBhZ28iKSwgemxpbT1jKDAsOTAwMCkpCiAgZGV2Lm9mZigpCn0KCmxpYnJhcnkobWFnaWNrKQojIyBsaXN0IGZpbGUgbmFtZXMgYW5kIHJlYWQgaW4KaW1ncyA8LSBsaXN0LmZpbGVzKCIuLi8uLi8zLURhdGFfcHJvY2Vzc2VkL0Nlbm96b2ljX2RlcHRoX3Jhc3RlcnNfcGxvdHMvIiwgZnVsbC5uYW1lcyA9IFRSVUUpCmltZ19saXN0IDwtIGxhcHBseShyZXYoaW1ncyksIGltYWdlX3JlYWQpCgojIyBqb2luIHRoZSBpbWFnZXMgdG9nZXRoZXIKaW1nX2pvaW5lZCA8LSBpbWFnZV9qb2luKGltZ19saXN0KQoKIyMgYW5pbWF0ZSBhdCAyIGZyYW1lcyBwZXIgc2Vjb25kCmltZ19hbmltYXRlZCA8LSBpbWFnZV9hbmltYXRlKGltZ19qb2luZWQsIGZwcyA9IDEwKQoKIyMgdmlldyBhbmltYXRlZCBpbWFnZQpwbG90KGltZ19hbmltYXRlZCkKCiMjIHNhdmUgdG8gZGlzawppbWFnZV93cml0ZShpbWFnZSA9IGltZ19hbmltYXRlZCwgCiAgICAgICAgICAgIHBhdGggPSAiLi4vLi4vMy1EYXRhX3Byb2Nlc3NlZC9DZW5vem9pY19kZXB0aF9yYXN0ZXJzX3Bsb3RzL0Nlbm96b2ljX2RlcHRoX3Jhc3RlcnNfYW5pbWF0aW9uLmdpZiIpCmBgYAoKKipHZW9ncmFwaGljIG51bGwgbW9kZWwqKjogVW5pZm9ybSBzYW1wbGluZyBvZiBtYXJpbmUgcG9pbnRzIGZyb20gZWFjaCBkZXB0aCByYXN0ZXIgaW4gY2VsbHMgZGVlcGVyIHRoYW4gMjAwbSwgZHJhd2luZyBpbiBlYWNoIGJpbiB0aGUgc2FtZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgYXMgaW4gVHJpdG9uLCB0byBzaW11bGF0ZSByYW5kb20gc2FtcGxpbmcgb2YgZm9zc2lscyBhY3Jvc3MgdGhlIENlbm96b2ljLgoKYGBge3IgZmlnLmFzcD0wLjQsIGZpZy53aWR0aD0xMiwgd2FybmluZz1GQUxTRX0KdHJpdG9uX2FnZV90YWJsZV8xTXkgPC0gdGFibGUocm91bmQodHJpdG9uJGFnZV9ydW5pZikpCgp1bmlmb3JtX3NhbXBsZXMgPC0gYygpCmZvciAoYWdlIGluIGFnZXNbMSArIDA6Zmxvb3IobGVuZ3RoKGFnZXMpLzIpICogMl0pIHsKICAjIExvYWQgdGhlIGRlcHRoIHJhc3RlciBmb3IgdGhlIGdpdmVuIGFnZQogIGN1dG9mZi5ycyA8LSBicmljayhwYXN0ZTAoIi4uLy4uLzEtRGF0YV9yYXcvQ2Vub3pvaWNfZGVwdGhfcmFzdGVycy9zY290X2V4dHJhcF9DZW5vXyIsIGFnZSwgIi50aWYiKSkKICAKICAjIEV4Y2x1ZGUgYXJlYXMgc2hhbGxvd2VyIHRoYW4gMjAwbQogIGN1dG9mZi5yc1tjdXRvZmYucnMgPCAyMDBdIDwtIE5BCgogICMgQ29tcHV0ZSB0aGUgYXJlYSBvZiBlYWNoIGNlbGwgdXNpbmcgdGVycmE6OmNlbGxTaXplCiAgY3V0b2ZmLnJzX3NwYXQgPC0gcmFzdChjdXRvZmYucnMpICAjIENvbnZlcnQgcmFzdGVyIHRvIFNwYXRSYXN0ZXIKICBjZWxsX2FyZWFzIDwtIGNlbGxTaXplKGN1dG9mZi5yc19zcGF0LCB1bml0ID0gImttIikgICMgQXJlYSBpbiBzcXVhcmUga2lsb21ldGVycwogIAogICMgTWFzayB0aGUgY2VsbCBhcmVhcyB0byBtYXRjaCB0aGUgZGVwdGggcmFzdGVyIChleGNsdWRpbmcgTkFzKQogIGNlbGxfYXJlYXMgPC0gbWFzayhjZWxsX2FyZWFzLCBjdXRvZmYucnNfc3BhdCkKICAKICAjIENvbnZlcnQgdGhlIHJhc3RlciB0byBwb2ludHMKICBtYXJpbmVfcG9pbnRzIDwtIGFzLmRhdGEuZnJhbWUocmFzdGVyVG9Qb2ludHMoY3V0b2ZmLnJzLCBzcGF0aWFsID0gVFJVRSkpCiAgCiAgIyBFeHRyYWN0IGNlbGwgYXJlYXMgY29ycmVzcG9uZGluZyB0byB0aGUgbWFyaW5lIHBvaW50cwogIG1hcmluZV9wb2ludHMkY2VsbF9hcmVhIDwtIGV4dHJhY3QoY2VsbF9hcmVhcywgbWFyaW5lX3BvaW50c1tjKCJ4IiwieSIpXSkkYXJlYQogIAogICMgUmVtb3ZlIHBvaW50cyB3aXRoIE5BIGFyZWEgKGlmIGFueSkKICAjbWFyaW5lX3BvaW50cyA8LSBtYXJpbmVfcG9pbnRzWyFpcy5uYShtYXJpbmVfcG9pbnRzJGNlbGxfYXJlYSksIF0KICAKICAjIFNhbXBsZSBwb2ludHMgd2l0aCBwcm9iYWJpbGl0eSBwcm9wb3J0aW9uYWwgdG8gY2VsbCBhcmVhCiAgc2FtcGxlZF9pbmRpY2VzIDwtIHNhbXBsZSgKICAgIDE6bnJvdyhtYXJpbmVfcG9pbnRzKSwKICAgIHNpemUgPSB0cml0b25fYWdlX3RhYmxlXzFNeVtwYXN0ZTAoYXMuaW50ZWdlcihhZ2UpKV0sCiAgICByZXBsYWNlID0gVFJVRSwKICAgIHByb2IgPSBtYXJpbmVfcG9pbnRzJGNlbGxfYXJlYQogICkKICAKICAjIENvbGxlY3QgdGhlIHNhbXBsZWQgcG9pbnRzCiAgc2FtcGxlZF9wb2ludHMgPC0gbWFyaW5lX3BvaW50c1tzYW1wbGVkX2luZGljZXMsIGMoIngiLCAieSIpXQogIHNhbXBsZWRfcG9pbnRzJGFnZSA8LSBhcy5udW1lcmljKGFnZSkKICAKICB1bmlmb3JtX3NhbXBsZXMgPC0gcmJpbmQodW5pZm9ybV9zYW1wbGVzLCBzYW1wbGVkX3BvaW50cykKfQp1bmlmb3JtX3NhbXBsZXMgPC0gZGF0YS5mcmFtZSh1bmlmb3JtX3NhbXBsZXMpCm5hbWVzKHVuaWZvcm1fc2FtcGxlcykgPC1jKCJsb25nIiwgImxhdCIsICJhZ2UiKQoKcGFyKG1mcm93PWMoMSwyKSkKaGlzdCh1bmlmb3JtX3NhbXBsZXMkbGF0LCBicmVha3M9NTAsIHByb2I9VCwgeGxhYj0iTGF0aXR1ZGUiLCBtYWluPSJMYXRpdHVkaW5hbCBudWxsIGRpc3RyaWJ1dGlvbiBvZiBmb3NzaWwgc2FtcGxlcyIpCmhpc3QodW5pZm9ybV9zYW1wbGVzJGxvbmcsIGJyZWFrcz01MCwgcHJvYj1ULCB4bGFiPSJMb25naXR1ZGUiLCBtYWluPSJMb25naXR1ZGluYWwgbnVsbCBkaXN0cmlidXRpb24gb2YgZm9zc2lsIHNhbXBsZXMiKQpgYGAKCk51bGwgZGlzdHJpYnV0aW9ucyBvZiBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIGZvciB0aGUgdW5pZm9ybWx5IHNhbXBsZWQgZm9zc2lscywgYWxsb3dpbmcgYSBjb21wYXJpc29uIG9mIHVuaWZvcm0gZm9zc2lsIHNhbXBsaW5nIHdpdGggYWN0dWFsIGZvc3NpbCBvY2N1cnJlbmNlcy4KCmBgYHtyIGZpZy5hc3A9MC40LCBmaWcud2lkdGg9MTIsIHdhcm5pbmc9RkFMU0V9CmR0eV9sYXRfcmVmIDwtIGRlbnNpdHkodW5pZm9ybV9zYW1wbGVzJGxhdCwgZnJvbT0tOTAsIHRvPTkwLCBjdXQ9VCkKZHR5X2xhdF9vYnMgPC0gZGVuc2l0eSh0cml0b24kcGFsLmxhdCwgYWRqdXN0PTAuNSwgZnJvbT0tOTAsIHRvPTkwLCBjdXQ9VCkKZHR5X2xvbmdfcmVmIDwtIGRlbnNpdHkodW5pZm9ybV9zYW1wbGVzJGxvbmcsIGZyb209LTE4MCwgdG89MTgwLCBjdXQ9VCkKZHR5X2xvbmdfb2JzIDwtIGRlbnNpdHkodHJpdG9uJHBhbC5sb25nLCBhZGp1c3Q9MC41LCBmcm9tPS0xODAsIHRvPTE4MCwgY3V0PVQpCgpwYXIobWZyb3c9YygxLDIpKQpoaXN0KHVuaWZvcm1fc2FtcGxlcyRsYXQsIGJyZWFrcz0xMDAsIHByb2I9VCwgeGxpbT1jKC05MCw5MCksIHlsaW09YygwLDAuMDIpLCB4bGFiPSJMYXRpdHVkZSIsIAogICAgIG1haW49IkxhdGl0dWRpbmFsIGRpc3RyaWJ1dGlvbiBvZiBmb3NzaWwgc2FtcGxlc1xuKG51bGwgbW9kZWwgdnMuIG9ic2VydmF0aW9ucykiKQpsaW5lcyhkdHlfbGF0X3JlZiwgbHdkPTIpCmhpc3QodHJpdG9uJHBhbC5sYXQsIGJyZWFrcz0xMDAsIHByb2I9VCwgYWRkPVQsIGNvbD1hbHBoYSgicmVkIiwgMC4zKSkKbGluZXMoZHR5X2xhdF9vYnMsIGx3ZD0yLCBjb2w9InJlZCIpCmhpc3QodW5pZm9ybV9zYW1wbGVzJGxvbmcsIGJyZWFrcz0xMDAsIHByb2I9VCwgeGxpbT1jKC0xODAsMTgwKSwgeWxpbT1jKDAsMC4wMSksIHhsYWI9IkxvbmdpdHVkZSIsIAogICAgIG1haW49IkxvbmdpdHVkaW5hbCBkaXN0cmlidXRpb24gb2YgZm9zc2lsIHNhbXBsZXNcbihudWxsIG1vZGVsIHZzLiBvYnNlcnZhdGlvbnMpIikKbGluZXMoZHR5X2xvbmdfcmVmLCBsd2Q9MikKaGlzdCh0cml0b24kcGFsLmxvbmcsIGJyZWFrcz0xMDAsIHByb2I9VCwgYWRkPVQsIGNvbD1hbHBoYSgicmVkIiwgMC4zKSkKbGluZXMoZHR5X2xvbmdfb2JzLCBsd2Q9MiwgY29sPSJyZWQiKQpgYGAKCkxldCdzIHN1YnNhbXBsZSBieSBvcHRpbWl6aW5nIHRoZSBzYW1wbGluZyBwcm9iYWJpbGl0eSBiYXNlZCBvbiBkZXZpYXRpb25zIGZyb20gdGhlIGV4cGVjdGVkIGRpc3RyaWJ1dGlvbnMgb3ZlciB0aW1lLCBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlLgoKYGBge3J9CiMgSGFybW9uaWMgbWVhbgpoYXJtX21lYW4gPC0gZnVuY3Rpb24oeCkgcmV0dXJuICgxIC8gbWVhbigxIC8geCwgbmEucm0gPSBUUlVFKSkKCiMgRnVuY3Rpb24gdG8gY29tcHV0ZSBzYW1wbGluZyBwcm9iYWJpbGl0aWVzCmNvbXB1dGVfc2FtcGxpbmdfcHJvYmFiaWxpdHkgPC0gZnVuY3Rpb24oZGF0YXNldCwgc09UVF9yZWYsIGR0eV9sYXRfcmVmLCBkdHlfbG9uZ19yZWYsIHRpbWVfcG9pbnRzKSB7CiAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBwZXIgdGltZSBwb2ludCAoT1RUKQogIE9UVCA8LSBzYXBwbHkodGltZV9wb2ludHMsIGZ1bmN0aW9uKHRpKQogICAgc3VtKGFicyhkYXRhc2V0JGFnZV9ydW5pZiAtIHRpKSA8PSBkaWZmKHRpbWVfcG9pbnRzKVsxXSAvIDIsIG5hLnJtID0gVFJVRSkpCiAgCiAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB1bmlxdWUgc3BlY2llcyBwZXIgdGltZSBwb2ludCAoZW1waXJpY2FsTFRUKQogIGVtcGlyaWNhbExUVCA8LSBzYXBwbHkodGltZV9wb2ludHMsIGZ1bmN0aW9uKHRpKQogICAgbGVuZ3RoKHVuaXF1ZShkYXRhc2V0W2FicyhkYXRhc2V0JGFnZV9ydW5pZiAtIHRpKSA8PSBkaWZmKHRpbWVfcG9pbnRzKVsxXSAvIDIsIF0kc3BlY2llcykpKQogIAogICMgQ2FsY3VsYXRlIHRoZSBzYW1wbGluZyByYXRlIChvY2N1cnJlbmNlcyBwZXIgbGluZWFnZSkgZm9yIGVhY2ggdGltZSBwb2ludAogIHNPVFQgPC0gT1RUIC8gZW1waXJpY2FsTFRUCiAgCiAgIyBDb21wdXRlIHRoZSBkZW5zaXR5IG9mIGZvc3NpbCBvY2N1cnJlbmNlcyBmb3IgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZQogIGR0eV9sYXRfb2JzIDwtIGRlbnNpdHkoZGF0YXNldCRwYWwubGF0LCBhZGp1c3QgPSAwLjUsIGZyb20gPSAtOTAsIHRvID0gOTAsIGN1dCA9IFRSVUUsIG5hLnJtID0gVFJVRSkKICBkdHlfbG9uZ19vYnMgPC0gZGVuc2l0eShkYXRhc2V0JHBhbC5sb25nLCBhZGp1c3QgPSAwLjUsIGZyb20gPSAtMTgwLCB0byA9IDE4MCwgY3V0ID0gVFJVRSwgbmEucm0gPSBUUlVFKQogIAogICMgSW50ZXJwb2xhdGUgc3Vic2FtcGxpbmcgc2NvcmVzIGJhc2VkIG9uIGFnZSwgbGF0aXR1ZGUsIGFuZCBsb25naXR1ZGUKICBkYXRhc2V0JHNzX3Njb3JlX2FnZSA8LSBzYXBwbHkoZGF0YXNldCRhZ2VfcnVuaWYsIGludGVycG9sYXRlX2N1cnZlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4X2dyaWQgPSB0aW1lX3BvaW50cywgeSA9IHNPVFRfcmVmIC8gc09UVCkKICBkYXRhc2V0JHNzX3Njb3JlX2xhdCA8LSBzYXBwbHkoZGF0YXNldCRwYWwubGF0LCBpbnRlcnBvbGF0ZV9jdXJ2ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeF9ncmlkID0gZHR5X2xhdF9yZWYkeCwgeSA9IGR0eV9sYXRfcmVmJHkgLyBkdHlfbGF0X29icyR5KQogIGRhdGFzZXQkc3Nfc2NvcmVfbG9uZyA8LSBzYXBwbHkoZGF0YXNldCRwYWwubG9uZywgaW50ZXJwb2xhdGVfY3VydmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4X2dyaWQgPSBkdHlfbG9uZ19yZWYkeCwgeSA9IGR0eV9sb25nX3JlZiR5IC8gZHR5X2xvbmdfb2JzJHkpCiAgCiAgIyBDYWxjdWxhdGUgdGhlIGhhcm1vbmljIG1lYW4gb2YgdGhlIHN1YnNhbXBsaW5nIHNjb3JlcwogIGRhdGFzZXQkc3Nfc2NvcmVfTE1IIDwtIGFwcGx5KGRhdGFzZXRbLCBjKCJzc19zY29yZV9hZ2UiLCAic3Nfc2NvcmVfbGF0IiwgInNzX3Njb3JlX2xvbmciKV0sIDEsIGhhcm1fbWVhbikKICAKICByZXR1cm4oZGF0YXNldCkKfQoKIyBGdW5jdGlvbiB0byBwZXJmb3JtIHN1YnNhbXBsaW5nCnN1YnNhbXBsZV9kYXRhc2V0IDwtIGZ1bmN0aW9uKGRhdGFzZXQsIHNPVFRfcmVmLCBkdHlfbGF0X3JlZiwgZHR5X2xvbmdfcmVmLCB0aW1lX3BvaW50cywgaXRlcmF0aW9ucykgewogIGZvciAoaSBpbiAxOml0ZXJhdGlvbnMpIHsKICAgIHByaW50KHBhc3RlKCJJdGVyYXRpb246IiwgaSkpCiAgICBkYXRhc2V0IDwtIGNvbXB1dGVfc2FtcGxpbmdfcHJvYmFiaWxpdHkoZGF0YXNldCwgc09UVF9yZWYsIGR0eV9sYXRfcmVmLCBkdHlfbG9uZ19yZWYsIHRpbWVfcG9pbnRzKQogICAgIyBTdWJzYW1wbGUgYnkgcmVtb3ZpbmcgdGhlIGJvdHRvbSAyMCUgYmFzZWQgb24gc3Nfc2NvcmVfTE1ICiAgICB0aHJlc2hvbGQgPC0gcXVhbnRpbGUoZGF0YXNldCRzc19zY29yZV9MTUgsIDAuMiwgbmEucm0gPSBUUlVFKQogICAgZGF0YXNldCA8LSBkYXRhc2V0W2RhdGFzZXQkc3Nfc2NvcmVfTE1IID4gdGhyZXNob2xkLCBdCiAgfQogIHJldHVybihkYXRhc2V0KQp9CgojIEFzc3VtZSBzT1RUX3JlZiwgZHR5X2xhdF9yZWYsIGR0eV9sb25nX3JlZiwgYW5kIHRpbWVfcG9pbnRzIGFyZSBhbHJlYWR5IGRlZmluZWQKIyBBbHNvLCBlbnN1cmUgJ2ludGVycG9sYXRlX2N1cnZlJyBmdW5jdGlvbiBpcyBkZWZpbmVkCgojIE9yaWdpbmFsIGRhdGFzZXQKdHJpdG9uLnNzIDwtIHRyaXRvbiAgIyBJZiB5b3UgaGF2ZSBhbiBpbml0aWFsIHN1YnNhbXBsZWQgZGF0YXNldCwgb3RoZXJ3aXNlIHVzZSAndHJpdG9uJwoKIyBTdWJzYW1wbGUgd2l0aCA2IGl0ZXJhdGlvbnMKdHJpdG9uLnNzNiA8LSBzdWJzYW1wbGVfZGF0YXNldCh0cml0b24uc3MsIHNPVFRfcmVmLCBkdHlfbGF0X3JlZiwgZHR5X2xvbmdfcmVmLCB0aW1lX3BvaW50cywgaXRlcmF0aW9ucyA9IDYpCgojIFN1YnNhbXBsZSB3aXRoIGFkZGl0aW9uYWwgaXRlcmF0aW9ucyB0byByZWFjaCAxNSB0b3RhbAp0cml0b24uc3MxNSA8LSBzdWJzYW1wbGVfZGF0YXNldCh0cml0b24uc3M2LCBzT1RUX3JlZiwgZHR5X2xhdF9yZWYsIGR0eV9sb25nX3JlZiwgdGltZV9wb2ludHMsIGl0ZXJhdGlvbnMgPSA5KQoKIyBDb250aW51ZSBzdWJzYW1wbGluZyB0byByZWFjaCAyMCB0b3RhbCBpdGVyYXRpb25zCnRyaXRvbi5zczIwIDwtIHN1YnNhbXBsZV9kYXRhc2V0KHRyaXRvbi5zczE1LCBzT1RUX3JlZiwgZHR5X2xhdF9yZWYsIGR0eV9sb25nX3JlZiwgdGltZV9wb2ludHMsIGl0ZXJhdGlvbnMgPSA1KQpgYGAKCmBgYHtyfQojIENvbXBhcmluZyB0aGUgYWdlIGRpc3RyaWJ1dGlvbnMgYWZ0ZXIgc3Vic2FtcGxpbmcKcmJpbmQoCiAgdHJpdG9uICAgICA9IHNpZ25pZih0YWJsZShhcy5mYWN0b3Iocm91bmQodHJpdG9uJGFnZV9ydW5pZiAvIDEwKSAqIDEwKSksIDIpLAogIHRyaXRvbi5zczYgPSBzaWduaWYodGFibGUoYXMuZmFjdG9yKHJvdW5kKHRyaXRvbi5zczYkYWdlX3J1bmlmIC8gMTApICogMTApKSwgMiksCiAgdHJpdG9uLnNzMTUgPSBzaWduaWYodGFibGUoYXMuZmFjdG9yKHJvdW5kKHRyaXRvbi5zczE1JGFnZV9ydW5pZiAvIDEwKSAqIDEwKSksIDIpLAogIHRyaXRvbi5zczIwID0gc2lnbmlmKHRhYmxlKGFzLmZhY3Rvcihyb3VuZCh0cml0b24uc3MyMCRhZ2VfcnVuaWYgLyAxMCkgKiAxMCkpLCAyKQopCmBgYApgYGB7ciBmaWcuYXNwPTAuNSwgZmlnLndpZHRoPTl9Ck9UVC5zczYgPC0gc2FwcGx5KHRpbWVfcG9pbnRzLCBmdW5jdGlvbih0aSlzdW0oYWJzKHRyaXRvbi5zczYkYWdlX3J1bmlmIC0gdGkpIDw9IGRpZmYodGltZV9wb2ludHMpWzFdLzIsIG5hLnJtPVQpKQplbXBpcmljYWxMVFQuc3M2IDwtIHNhcHBseSh0aW1lX3BvaW50cywgZnVuY3Rpb24odGkpbGVuZ3RoKHVuaXF1ZSh0cml0b24uc3M2W2Ficyh0cml0b24uc3M2JGFnZV9ydW5pZiAtIHRpKSA8PSBkaWZmKHRpbWVfcG9pbnRzKVsxXS8yLF0kc3BlY2llcykpKQpkdHlfbGF0X29icy5zczYgPC0gZGVuc2l0eSh0cml0b24uc3M2JHBhbC5sYXQsIGFkanVzdD0wLjUsIGZyb209LTkwLCB0bz05MCwgY3V0PVQsIG5hLnJtPVQpCmR0eV9sb25nX29icy5zczYgPC0gZGVuc2l0eSh0cml0b24uc3M2JHBhbC5sb25nLCBhZGp1c3Q9MC41LCBmcm9tPS0xODAsIHRvPTE4MCwgY3V0PVQsIG5hLnJtPVQpCk9UVC5zczE1IDwtIHNhcHBseSh0aW1lX3BvaW50cywgZnVuY3Rpb24odGkpc3VtKGFicyh0cml0b24uc3MxNSRhZ2VfcnVuaWYgLSB0aSkgPD0gZGlmZih0aW1lX3BvaW50cylbMV0vMiwgbmEucm09VCkpCmVtcGlyaWNhbExUVC5zczE1IDwtIHNhcHBseSh0aW1lX3BvaW50cywgZnVuY3Rpb24odGkpbGVuZ3RoKHVuaXF1ZSh0cml0b24uc3MxNVthYnModHJpdG9uLnNzMTUkYWdlX3J1bmlmIC0gdGkpIDw9IGRpZmYodGltZV9wb2ludHMpWzFdLzIsXSRzcGVjaWVzKSkpCmR0eV9sYXRfb2JzLnNzMTUgPC0gZGVuc2l0eSh0cml0b24uc3MxNSRwYWwubGF0LCBhZGp1c3Q9MC41LCBmcm9tPS05MCwgdG89OTAsIGN1dD1ULCBuYS5ybT1UKQpkdHlfbG9uZ19vYnMuc3MxNSA8LSBkZW5zaXR5KHRyaXRvbi5zczE1JHBhbC5sb25nLCBhZGp1c3Q9MC41LCBmcm9tPS0xODAsIHRvPTE4MCwgY3V0PVQsIG5hLnJtPVQpCk9UVC5zczIwIDwtIHNhcHBseSh0aW1lX3BvaW50cywgZnVuY3Rpb24odGkpc3VtKGFicyh0cml0b24uc3MyMCRhZ2VfcnVuaWYgLSB0aSkgPD0gZGlmZih0aW1lX3BvaW50cylbMV0vMiwgbmEucm09VCkpCmVtcGlyaWNhbExUVC5zczIwIDwtIHNhcHBseSh0aW1lX3BvaW50cywgZnVuY3Rpb24odGkpbGVuZ3RoKHVuaXF1ZSh0cml0b24uc3MyMFthYnModHJpdG9uLnNzMjAkYWdlX3J1bmlmIC0gdGkpIDw9IGRpZmYodGltZV9wb2ludHMpWzFdLzIsXSRzcGVjaWVzKSkpCmR0eV9sYXRfb2JzLnNzMjAgPC0gZGVuc2l0eSh0cml0b24uc3MyMCRwYWwubGF0LCBhZGp1c3Q9MC41LCBmcm9tPS05MCwgdG89OTAsIGN1dD1ULCBuYS5ybT1UKQpkdHlfbG9uZ19vYnMuc3MyMCA8LSBkZW5zaXR5KHRyaXRvbi5zczIwJHBhbC5sb25nLCBhZGp1c3Q9MC41LCBmcm9tPS0xODAsIHRvPTE4MCwgY3V0PVQsIG5hLnJtPVQpCmBgYAoKYGBge3IgZmlnLmFzcD0wLjUsIGZpZy53aWR0aD0xNX0KIyBUaW1lCnBhcihtZnJvdz1jKDMsNCkpCnBsb3QodGltZV9wb2ludHMsIE9UVC9lbXBpcmljYWxMVFQsIHlsaW09YygxLDEwMDApLCBsb2c9InkiLCB0eXBlPSJsIiwgY29sPSJicm93biIsIG1haW49IlNhbXBsaW5nIHJhdGUgdGhyb3VnaCB0aW1lIiwgeGxhYj0iQWdlIChNeXJzKSIsIHlsYWI9Ik9jY3VycmVuY2VzIHBlciBsaW5lYWdlIikKcG9pbnRzKHRpbWVfcG9pbnRzLCBPVFQvZW1waXJpY2FsTFRULCBwY2g9MTksIGNleD0wLjUsIGNvbD0iYnJvd24iKQpsaW5lcyhyYW5nZSh0aW1lX3BvaW50cyksIGMoc09UVF9yZWYsIHNPVFRfcmVmKSwgbHdkPTIpCnBsb3QodGltZV9wb2ludHMsIE9UVC5zczYvZW1waXJpY2FsTFRULnNzNiwgeWxpbT1jKDEsMTAwMCksIGxvZz0ieSIsIHR5cGU9ImwiLCBjb2w9ImNvcmFsNCIsIG1haW49cGFzdGUwKCJTYW1wbGluZyByYXRlIHRocm91Z2ggdGltZSB3aXRoICIsIG5yb3codHJpdG9uLnNzNikgLCIgZm9zc2lscyIpLCB4bGFiPSJBZ2UgKE15cnMpIiwgeWxhYj0iT2NjdXJyZW5jZXMgcGVyIGxpbmVhZ2UiKQpwb2ludHModGltZV9wb2ludHMsIE9UVC5zczYvZW1waXJpY2FsTFRULnNzNiwgcGNoPTE5LCBjZXg9MC41LCBjb2w9ImNvcmFsNCIpCmxpbmVzKHJhbmdlKHRpbWVfcG9pbnRzKSwgYyhtZWRpYW4oT1RULnNzNi9lbXBpcmljYWxMVFQuc3M2LCBuYS5ybT1UKSwgbWVkaWFuKE9UVC5zczYvZW1waXJpY2FsTFRULnNzNiwgbmEucm09VCkpLCBsd2Q9MikKcGxvdCh0aW1lX3BvaW50cywgT1RULnNzMTUvZW1waXJpY2FsTFRULnNzMTUsIHlsaW09YygxLDEwMDApLCBsb2c9InkiLCB0eXBlPSJsIiwgY29sPSJjb3JhbDMiLCBtYWluPXBhc3RlMCgiU2FtcGxpbmcgcmF0ZSB0aHJvdWdoIHRpbWUgd2l0aCAiLCBucm93KHRyaXRvbi5zczE1KSAsIiBmb3NzaWxzIiksIHhsYWI9IkFnZSAoTXlycykiLCB5bGFiPSJPY2N1cnJlbmNlcyBwZXIgbGluZWFnZSIpCnBvaW50cyh0aW1lX3BvaW50cywgT1RULnNzMTUvZW1waXJpY2FsTFRULnNzMTUsIHBjaD0xOSwgY2V4PTAuNSwgY29sPSJjb3JhbDMiKQpsaW5lcyhyYW5nZSh0aW1lX3BvaW50cyksIGMobWVkaWFuKE9UVC5zczE1L2VtcGlyaWNhbExUVC5zczE1LCBuYS5ybT1UKSwgbWVkaWFuKE9UVC5zczE1L2VtcGlyaWNhbExUVC5zczE1LCBuYS5ybT1UKSksIGx3ZD0yKQpwbG90KHRpbWVfcG9pbnRzLCBPVFQuc3MyMC9lbXBpcmljYWxMVFQuc3MyMCwgeWxpbT1jKDEsMTAwMCksIGxvZz0ieSIsIHR5cGU9ImwiLCBjb2w9ImNvcmFsMSIsIG1haW49cGFzdGUwKCJTYW1wbGluZyByYXRlIHRocm91Z2ggdGltZSB3aXRoICIsIG5yb3codHJpdG9uLnNzMjApICwiIGZvc3NpbHMiKSwgeGxhYj0iQWdlIChNeXJzKSIsIHlsYWI9Ik9jY3VycmVuY2VzIHBlciBsaW5lYWdlIikKcG9pbnRzKHRpbWVfcG9pbnRzLCBPVFQuc3MyMC9lbXBpcmljYWxMVFQuc3MyMCwgcGNoPTE5LCBjZXg9MC41LCBjb2w9ImNvcmFsMSIpCmxpbmVzKHJhbmdlKHRpbWVfcG9pbnRzKSwgYyhtZWRpYW4oT1RULnNzMjAvZW1waXJpY2FsTFRULnNzMjAsIG5hLnJtPVQpLCBtZWRpYW4oT1RULnNzMjAvZW1waXJpY2FsTFRULnNzMjAsIG5hLnJtPVQpKSwgbHdkPTIpCgojIExhdGl0dWRlCmhpc3QodW5pZm9ybV9zYW1wbGVzJGxhdCwgYnJlYWtzPTUwLCBwcm9iPVQsIHlsaW09YygwLDAuMDIpLCBtYWluPSJSYXcgbGF0aXR1ZGluYWwgZGlzdHJpYnV0aW9uIiwgeGxhYj0iTGF0aXR1ZGUiLCB5bGFiPSJGb3NzaWwgc2FtcGxpbmcgZGVuc2l0eSIpCmxpbmVzKGR0eV9sYXRfcmVmLCBsd2Q9MikKaGlzdCh0cml0b24kcGFsLmxhdCwgYnJlYWtzPTUwLCBwcm9iPVQsIGFkZD1ULCBjb2w9YWxwaGEoInJlZCIsIDAuMSkpCmxpbmVzKGR0eV9sYXRfb2JzLCBsd2Q9MiwgY29sPSJyZWQiKQpwbG90KGR0eV9sYXRfcmVmLCB0eXBlPSJsIiwgbHdkPTIsIHlsaW09YygwLDAuMDIpLCBtYWluPXBhc3RlMCgiTGF0aXR1ZGluYWwgZGlzdHJpYnV0aW9uIHdpdGggIiwgbnJvdyh0cml0b24uc3M2KSAsIiBmb3NzaWxzIiksIHhsYWI9IkxhdGl0dWRlIiwgeWxhYj0iRm9zc2lsIHNhbXBsaW5nIGRlbnNpdHkiKQpsaW5lcyhkdHlfbGF0X29icy5zczYsIGx3ZD0yLCBjb2w9ImNvcmFsNCIpCnBsb3QoZHR5X2xhdF9yZWYsIHR5cGU9ImwiLCBsd2Q9MiwgeWxpbT1jKDAsMC4wMiksIG1haW49cGFzdGUwKCJMYXRpdHVkaW5hbCBkaXN0cmlidXRpb24gd2l0aCAiLCBucm93KHRyaXRvbi5zczE1KSAsIiBmb3NzaWxzIiksIHhsYWI9IkxhdGl0dWRlIiwgeWxhYj0iRm9zc2lsIHNhbXBsaW5nIGRlbnNpdHkiKQpsaW5lcyhkdHlfbGF0X29icy5zczE1LCBsd2Q9MiwgY29sPSJjb3JhbDMiKQpwbG90KGR0eV9sYXRfcmVmLCB0eXBlPSJsIiwgbHdkPTIsIHlsaW09YygwLDAuMDIpLCBtYWluPXBhc3RlMCgiTGF0aXR1ZGluYWwgZGlzdHJpYnV0aW9uIHdpdGggIiwgbnJvdyh0cml0b24uc3MyMCkgLCIgZm9zc2lscyIpLCB4bGFiPSJMYXRpdHVkZSIsIHlsYWI9IkZvc3NpbCBzYW1wbGluZyBkZW5zaXR5IikKbGluZXMoZHR5X2xhdF9vYnMuc3MyMCwgbHdkPTIsIGNvbD0iY29yYWwxIikKCiMgTG9uZ2l0dWRlCmhpc3QodW5pZm9ybV9zYW1wbGVzJGxvbmcsIGJyZWFrcz01MCwgcHJvYj1ULCB5bGltPWMoMCwwLjAxKSwgbWFpbj0iUmF3IGxvbmdpdHVkaW5hbCBkaXN0cmlidXRpb24iLCB4bGFiPSJMb25naXR1ZGUiLCB5bGFiPSJGb3NzaWwgc2FtcGxpbmcgZGVuc2l0eSIpCmxpbmVzKGR0eV9sb25nX3JlZiwgbHdkPTIpCmhpc3QodHJpdG9uJHBhbC5sb25nLCBicmVha3M9NTAsIHByb2I9VCwgYWRkPVQsIGNvbD1hbHBoYSgicmVkIiwgMC4xKSkKbGluZXMoZHR5X2xvbmdfb2JzLCBsd2Q9MiwgY29sPSJyZWQiKQpwbG90KGR0eV9sb25nX3JlZiwgdHlwZT0ibCIsIGx3ZD0yLCB5bGltPWMoMCwwLjAxKSwgbWFpbj1wYXN0ZTAoIkxvbmdpdHVkaW5hbCBkaXN0cmlidXRpb24gd2l0aCAiLCBucm93KHRyaXRvbi5zczYpICwiIGZvc3NpbHMiKSwgeGxhYj0iTG9uZ2l0dWRlIiwgeWxhYj0iRm9zc2lsIHNhbXBsaW5nIGRlbnNpdHkiKQpsaW5lcyhkdHlfbG9uZ19vYnMuc3M2LCBsd2Q9MiwgY29sPSJjb3JhbDQiKQpwbG90KGR0eV9sb25nX3JlZiwgdHlwZT0ibCIsIGx3ZD0yLCB5bGltPWMoMCwwLjAxKSwgbWFpbj1wYXN0ZTAoIkxvbmdpdHVkaW5hbCBkaXN0cmlidXRpb24gd2l0aCAiLCBucm93KHRyaXRvbi5zczE1KSAsIiBmb3NzaWxzIiksIHhsYWI9IkxvbmdpdHVkZSIsIHlsYWI9IkZvc3NpbCBzYW1wbGluZyBkZW5zaXR5IikKbGluZXMoZHR5X2xvbmdfb2JzLnNzMTUsIGx3ZD0yLCBjb2w9ImNvcmFsMyIpCnBsb3QoZHR5X2xvbmdfcmVmLCB0eXBlPSJsIiwgbHdkPTIsIHlsaW09YygwLDAuMDEpLCBtYWluPXBhc3RlMCgiTG9uZ2l0dWRpbmFsIGRpc3RyaWJ1dGlvbiB3aXRoICIsIG5yb3codHJpdG9uLnNzMjApICwiIGZvc3NpbHMiKSwgeGxhYj0iTG9uZ2l0dWRlIiwgeWxhYj0iRm9zc2lsIHNhbXBsaW5nIGRlbnNpdHkiKQpsaW5lcyhkdHlfbG9uZ19vYnMuc3MyMCwgbHdkPTIsIGNvbD0iY29yYWwxIikKYGBgCgpUaGlzIG1ldGhvZCByZWR1Y2VzIHRoZSB0ZW1wb3JhbCBhbmQgZ2VvZ3JhcGhpY2FsIGJpYXNlcywgYnV0IHJlcXVpcmVzIGFnYWluIHRvIGtub3cgdGhlIGV4cGVjdGVkIHRlbXBvcmFsIHJpY2huZXNzIHRyYWplY3RvcnkuIExldCdzIHRyeSBhIHN1YnNhbXBsaW5nIG1ldGhvZCB0aGF0IGRvZXMgbm90IHVzZSB0aGlzIGluZm9ybWF0aW9uLgoKIyBIb2xlLWJhc2VkIHN1YnNhbXBsaW5nCgpJbiB0aGlzIHNlY3Rpb24sIHdlIGFpbSB0byByZWR1Y2Ugc2FtcGxpbmcgYmlhc2VzIGluIG91ciBkYXRhc2V0IGJ5IHBlcmZvcm1pbmcgc3Vic2FtcGxpbmcgYmFzZWQgb24gZHJpbGxpbmcgaG9sZXMgKGxvY2F0aW9ucyB3aGVyZSBmb3NzaWxzIHdlcmUgY29sbGVjdGVkKS4gVGhlIGdvYWwgaXMgdG8gYWNoaWV2ZSBhIG1vcmUgdW5pZm9ybSBzYW1wbGluZyBlZmZvcnQgYWNyb3NzIGRpZmZlcmVudCBob2xlcyBhbmQgdGhyb3VnaCB0aW1lLgoKIyMgQ2FsY3VsYXRpbmcgT2NjdXJyZW5jZSBEZW5zaXR5IHBlciBIb2xlCgpgYGB7ciBmaWcuYXNwPTAuNCwgZmlnLndpZHRoPTEyfQojIE51bWJlciBvZiBvY2N1cnJlbmNlcywgbWluaW11bSBhbmQgbWF4aW11bSBhZ2VzIGZvciBlYWNoIGhvbGUKSG9sZU5iT2NjIDwtIHRhYmxlKHRyaXRvbiRob2xlSUQpCkhvbGVNaW5BZ2UgPC0gcm91bmQoc2FwcGx5KG5hbWVzKEhvbGVOYk9jYyksIGZ1bmN0aW9uKGhvbGVJRCltaW4odHJpdG9uW3RyaXRvbiRob2xlSUQgPT0gaG9sZUlELCAiYWdlX3J1bmlmIl0pKSwgMykKSG9sZU1heEFnZSA8LSByb3VuZChzYXBwbHkobmFtZXMoSG9sZU5iT2NjKSwgZnVuY3Rpb24oaG9sZUlEKW1heCh0cml0b25bdHJpdG9uJGhvbGVJRCA9PSBob2xlSUQsICJhZ2VfcnVuaWYiXSkpLCAzKQoKIyBDb21wdXRlIHRoZSBvY2N1cnJlbmNlIGRlbnNpdHkgb2YgZWFjaCBob2xlIChhdm9pZCBkaXZpc2lvbiBieSB6ZXJvIGJ5IHNldHRpbmcgYSBtaW5pbXVtIGR1cmF0aW9uKQpIb2xlRHVyYXRpb24gPC0gc2FwcGx5KEhvbGVNYXhBZ2UgLSBIb2xlTWluQWdlLCBtYXgsIGEgPSAwLjAwMSkKSG9sZUR0eU9jYyA8LSBIb2xlTmJPY2Mvc2FwcGx5KEhvbGVNYXhBZ2UtSG9sZU1pbkFnZSwgbWF4LCBhPTAuMDAxKQoKIyBDb21wdXRlIHRoZSBudW1iZXIgb2YgYWN0aXZlIGhvbGVzIHRocm91Z2ggdGltZSAoSFRUKQpIVFQgPC0gc2FwcGx5KHRpbWVfcG9pbnRzLCBmdW5jdGlvbih0aSlsZW5ndGgod2hpY2gocm91bmQoSG9sZU1pbkFnZSwgMik8PXRpICYgdGk8PXJvdW5kKEhvbGVNYXhBZ2UsIDIpKSkpCgojIENyZWF0ZSBhIGRhdGEgZnJhbWUgZm9yIHBsb3R0aW5nCmhvbGVfZGF0YSA8LSBkYXRhLmZyYW1lKAogIEhvbGVNaW5BZ2UgPSBIb2xlTWluQWdlLAogIEhvbGVNYXhBZ2UgPSBIb2xlTWF4QWdlLAogIEhvbGVEdHlPY2MgPSBhcy52ZWN0b3IoSG9sZUR0eU9jYykKKQoKIyBQbG90IG9jY3VycmVuY2UgZGVuc2l0eSBwZXIgaG9sZSBvdmVyIHRpbWUKZ2dwbG90KGhvbGVfZGF0YSkgKwogIGdlb21fbGluZXJhbmdlKGFlcyh5ID0gSG9sZUR0eU9jYywgeG1pbiA9IEhvbGVNaW5BZ2UsIHhtYXggPSBIb2xlTWF4QWdlLAogICAgICAgICAgICAgICAgICAgICBjb2xvciA9IEhvbGVEdHlPY2MpLCBsaW5ld2lkdGggPSAwLjMpICsKICAjc2NhbGVfY29sb3JfY29udGludW91cygiT2NjdXJyZW5jZSBEZW5zaXR5IiwgdHJhbnMgPSAibG9nMTAiKSArCiAgc2NhbGVfY29sb3JfZ3JhZGllbnQobG93ID0gImxpZ2h0Ymx1ZSIsIGhpZ2ggPSAiZG9kZ2VyYmx1ZTQiLCBuYW1lID0gIk9jY3VycmVuY2UgRGVuc2l0eSIsIHRyYW5zID0gImxvZzEwIikgKwogIHNjYWxlX3lfbG9nMTAoIk9jY3VycmVuY2UgRGVuc2l0eSIsIGJyZWFrcyA9IGMoMSwgMTAwLCAxMDAwMCkpICsKICBsYWJzKHRpdGxlID0gIkRyaWxsaW5nIEhvbGVzIE92ZXIgVGltZSBhbmQgdGhlaXIgRGVuc2l0eSBvZiBPY2N1cnJlbmNlcyIpCmBgYAoKVGhpcyBwbG90IGhpZ2hsaWdodHMgaG9sZXMgd2l0aCB1bnVzdWFsbHkgaGlnaCBkZW5zaXRpZXMgdGhhdCBtYXkgaW50cm9kdWNlIHNhbXBsaW5nIGJpYXMuCgojIyBTdWJzYW1wbGUgYXQgdGhlIFNlZGltZW50IFNhbXBsZSBsZXZlbAoKSW4gdGhpcyBzZWN0aW9uLCB3ZSBmb2N1cyBvbiBzdWJzYW1wbGluZyBhdCB0aGUgc2FtcGxlIGxldmVsIHRvIHJlZHVjZSBzYW1wbGluZyBiaWFzZXMgYnkgaG9tb2dlbml6aW5nIHRoZSBudW1iZXIgb2Ygc2VkaW1lbnQgc2FtcGxlcyBwZXIgaG9sZSB0aHJvdWdoIHRpbWUuIFRoaXMgbWV0aG9kIGFpbXMgdG8gY3JlYXRlIGEgbW9yZSBiYWxhbmNlZCBkYXRhc2V0IGJ5IGFkanVzdGluZyBmb3Igb3ZlcnJlcHJlc2VudGVkIGhvbGVzIGFuZCB0aW1lIHBlcmlvZHMuCgojIyMgVmlzdWFsaXppbmcgdGhlIE9jY3VycmVuY2UgRGVuc2l0eSBwZXIgU2FtcGxlIGFuZCB0aGUgU2FtcGxlIERlbnNpdHkgcGVyIEhvbGUKCi0gYEhvbGVOYlNhbXBsZWA6IE51bWJlciBvZiB1bmlxdWUgc2FtcGxlcyBjb2xsZWN0ZWQgZnJvbSBlYWNoIGhvbGUuCi0gYEhvbGVEdHlTYW1wbGVgOiBEZW5zaXR5IG9mIHNhbXBsZXMgcGVyIGhvbGUsIGFkanVzdGVkIGZvciB0aGUgZHVyYXRpb24gb2Ygc2FtcGxpbmcgYXQgZWFjaCBob2xlLgotIGBTVFRgOiBOdW1iZXIgb2Ygc2FtcGxlcyBjb2xsZWN0ZWQgYXQgZWFjaCB0aW1lIHBvaW50LgoKYGBge3IgZmlnLmFzcD0wLjQsIGZpZy53aWR0aD0xMn0KIyBDcmVhdGUgYSBkYXRhIGZyYW1lIG9mIHNhbXBsZSBjb3VudHMgcGVyIHNhbXBsZUlECnNhbXBsZXMgPC0gZGF0YS5mcmFtZShuYiA9IGFzLm1hdHJpeCh0YWJsZSh0cml0b24kc2FtcGxlSUQpKSkKc2FtcGxlcyRhZ2UgPC0gdHJpdG9uW3NhcHBseShyb3duYW1lcyhzYW1wbGVzKSwgbWF0Y2gsIHRhYmxlID0gdHJpdG9uJHNhbXBsZUlEKSwgXSRhZ2UKCiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdW5pcXVlIHNhbXBsZXMgcGVyIGhvbGUKSG9sZU5iU2FtcGxlIDwtIHNhcHBseShuYW1lcyhIb2xlTmJPY2MpLCBmdW5jdGlvbihob2xlSUQpCiAgbGVuZ3RoKHVuaXF1ZSh0cml0b25bdHJpdG9uJGhvbGVJRCA9PSBob2xlSUQsICJzYW1wbGVJRCJdKSkpCgojIENhbGN1bGF0ZSB0aGUgZGVuc2l0eSBvZiBzYW1wbGVzIHBlciBob2xlIChudW1iZXIgb2Ygc2FtcGxlcyBwZXIgdW5pdCB0aW1lKQpIb2xlRHR5U2FtcGxlIDwtIEhvbGVOYlNhbXBsZSAvIHNhcHBseShIb2xlTWF4QWdlIC0gSG9sZU1pbkFnZSwgbWF4LCBhID0gMC4wMDEpCgojIENvbXB1dGUgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRocm91Z2ggdGltZSAoU1RUKQpTVFQgPC0gaGlzdChzYW1wbGVzJGFnZSwgYnJlYWtzID0gc2VxKG1pbih0aW1lX3BvaW50cyksIG1heCh0aW1lX3BvaW50cyksIGxlbmd0aCA9IGxlbmd0aCh0aW1lX3BvaW50cykgKyAxKSwgcGxvdCA9IEZBTFNFKSRjb3VudAoKIyBBdm9pZCBkaXZpc2lvbiBieSB6ZXJvClNUVFtTVFQgPT0gMF0gPC0gMQoKZ2dwbG90KHNhbXBsZXMsIGFlcyh4ID0gYWdlLCB5ID0gbmIpKSArIAogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjEsIHNpemUgPSAwLjUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJBZ2Ugb2YgdGhlIFNhbXBsZSAoTWEpIikgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIk51bWJlciBvZiBPY2N1cnJlbmNlcyBwZXIgU2FtcGxlIikgKwogIHN0YXRfc21vb3RoKGZvcm11bGEgPSB5IH4gcyh4KSwgbWV0aG9kID0gImdhbSIsIG1ldGhvZC5hcmdzID0gbGlzdChmYW1pbHkgPSAibmIiKSkgKwogIGxhYnModGl0bGUgPSAiT2NjdXJyZW5jZXMgcGVyIFNhbXBsZSBPdmVyIFRpbWUiKQpgYGAKClRoZSBtZWFuIG51bWJlciBvZiBvY2N1cnJlbmNlcyBwZXIgc2FtcGxlIGxvb2tzIG11Y2ggbW9yZSBsaWtlIHRoZSBkaXN0cmlidXRpb24gb2Ygc3BlY2llcyBvdmVyIHRpbWUuIExldCdzIGxvb2sgYXQgdGhpcyBxdWFudGl0eSBkaXJlY3RseS4KCi0gYFNwSFRUYCA9IFNhbXBsZXMgcGVyIGhvbGUgdGhyb3VnaCB0aW1lCi0gYE9wU1RUYCA9IE9jY3VycmVuY2VzIHBlciBzYW1wbGUgdGhyb3VnaCB0aW1lCgpgYGB7ciBmaWcuYXNwPTAuMywgZmlnLndpZHRoPTEyfQpwYXIobWZyb3cgPSBjKDEsIDMpKQoKIyBQbG90IHRoZSBudW1iZXIgb2YgaG9sZXMgdGhyb3VnaCB0aW1lCnBsb3QodGltZV9wb2ludHMsIEhUVCwgdHlwZSA9ICJsIiwgbWFpbiA9ICJOdW1iZXIgb2YgSG9sZXMgVGhyb3VnaCBUaW1lIiwgeGxhYiA9ICJUaW1lIChNYSkiLCB5bGFiID0gIk51bWJlciBvZiBIb2xlcyIsIGNvbD0iZG9kZ2VyYmx1ZTQiKQpwb2ludHModGltZV9wb2ludHMsIEhUVCwgcGNoID0gMTksIGNleCA9IDAuNSwgY29sPSJkb2RnZXJibHVlNCIpCgojIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIGhvbGUgYW5kIG51bWJlciBvZiBvY2N1cnJlbmNlcyBwZXIgc2FtcGxlIHRocm91Z2ggdGltZQpPcFNUVCA8LSBPVFQgLyBTVFQKCiMgUGxvdCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIGhvbGUgdGhyb3VnaCB0aW1lCnBsb3QobG9lc3Muc21vb3RoKHRpbWVfcG9pbnRzLCBTVFQsIHNwYW4gPSAwLjEpLCB0eXBlID0gImwiLCBsd2QgPSAzLCBjb2w9ImRvZGdlcmJsdWU0IiwKICAgICBtYWluID0gIk51bWJlciBvZiBTZWRpbWVudCBTYW1wbGVzIFRocm91Z2ggVGltZSIsIHhsYWIgPSAiVGltZSAoTWEpIiwgeWxhYiA9ICJOdW1iZXIgb2YgU2FtcGxlcyIpCnBvaW50cyh0aW1lX3BvaW50cywgU1RULCBwY2ggPSAxOSwgY2V4ID0gMC41LCBjb2wgPSBhbHBoYSgiZG9kZ2VyYmx1ZTQiLCAwLjMpKQoKIyBQbG90IHRoZSBzdGFuZGFyZGl6ZWQgZGlzdHJpYnV0aW9uIG9mIG9jY3VycmVuY2VzIHRocm91Z2ggdGltZQpwbG90KGxvZXNzLnNtb290aCh0aW1lX3BvaW50cywgT3BTVFQgKiA2LCBzcGFuID0gMC4xKSwgdHlwZSA9ICJsIiwgbHdkID0gMywgY29sPSJwYWxlZ3JlZW40IiwgeWxpbSA9IGMoMCwgMTAwKSwKICAgICBtYWluID0gIk9jY3VycmVuY2VzIHBlciBTYW1wbGUgVGhyb3VnaCBUaW1lIiwgeGxhYiA9ICJUaW1lIChNYSkiLCB5bGFiID0gIk9jY3VycmVuY2VzIHBlciBTYW1wbGUgKHg2KSIpCnBvaW50cyh0aW1lX3BvaW50cywgT3BTVFQgKiA2LCBwY2ggPSAxOSwgY2V4ID0gMC41LCBjb2wgPSBhbHBoYSgicGFsZWdyZWVuNCIsIDAuMykpCmxpbmVzKHRpbWVfcG9pbnRzLCBleHBlcnRMVFQsIGNvbCA9ICJvcmNoaWQ0IiwgbHdkPTIpCmBgYAoKIyMjIFN1YnNhbXBsaW5nIC0gSG9tb2dlbml6ZSB0aGUgTnVtYmVyIG9mIFNhbXBsZXMgVGhyb3VnaCBUaW1lIChzcy5TVFQpCgpgYGB7cn0KIyBEZWZpbmUgdGhlIHJlZmVyZW5jZSBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgdGltZSBiaW4gKGUuZy4sIDI1dGggcGVyY2VudGlsZSkKU1RUX3JlZiA8LSBxdWFudGlsZShTVFQsIDAuMjUpCgojIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBzYW1wbGluZyBwcm9iYWJpbGl0eSBmb3IgZWFjaCBzYW1wbGUgYmFzZWQgb24gaXRzIGFnZQpzYW1wbGluZ19wcm9iYV9zYW1wbGUgPC0gZnVuY3Rpb24oc2FtcGxlX2FnZSkgewogICMgSW50ZXJwb2xhdGUgdGhlIHJhdGlvIG9mIGRlc2lyZWQgdG8gYWN0dWFsIG51bWJlciBvZiBzYW1wbGVzIGF0IHRoZSBzYW1wbGUncyBhZ2UKICByYXRpbyA8LSBpbnRlcnBvbGF0ZV9jdXJ2ZSh4X2dyaWQgPSB0aW1lX3BvaW50cywgeCA9IHNhbXBsZV9hZ2UsIHkgPSBTVFRfcmVmIC8gU1RUKQogICMgRW5zdXJlIHRoZSBwcm9iYWJpbGl0eSBkb2VzIG5vdCBleGNlZWQgMQogIHJldHVybihtaW4ocmF0aW8sIDEpKQp9CgojIENhbGN1bGF0ZSBzYW1wbGluZyBwcm9iYWJpbGl0aWVzIGZvciBhbGwgc2FtcGxlcwpzYW1wbGVzJHByb2JhIDwtIHNhcHBseShzYW1wbGVzJGFnZSwgc2FtcGxpbmdfcHJvYmFfc2FtcGxlKQoKIyBTdWJzYW1wbGUgdGhlIHNhbXBsZXMgYmFzZWQgb24gY2FsY3VsYXRlZCBwcm9iYWJpbGl0aWVzCnNldC5zZWVkKDEyMykgICMgRm9yIHJlcHJvZHVjaWJpbGl0eQpzYW1wbGVkX3NhbXBsZUlEcyA8LSByb3duYW1lcyhzYW1wbGVzKVthcy5sb2dpY2FsKHJiaW5vbShuID0gbnJvdyhzYW1wbGVzKSwgc2l6ZSA9IDEsIHByb2IgPSBzYW1wbGVzJHByb2JhKSldCgojIENyZWF0ZSB0aGUgc3Vic2FtcGxlZCBkYXRhc2V0CnRyaXRvbi5zcy5TVFQgPC0gdHJpdG9uW3RyaXRvbiRzYW1wbGVJRCAlaW4lIHNhbXBsZWRfc2FtcGxlSURzLCBdCmBgYAoKYGBge3J9CiMgUmVjYWxjdWxhdGUgU1RUIGFuZCBPVFQgYWZ0ZXIgc3Vic2FtcGxpbmcKc2FtcGxlcy5zcy5TVFQgPC0gZGF0YS5mcmFtZSgKICBuYiA9IHNhcHBseSh1bmlxdWUodHJpdG9uLnNzLlNUVCRzYW1wbGVJRCksIGZ1bmN0aW9uKHNpZCkgbnJvdyh0cml0b24uc3MuU1RUW3RyaXRvbi5zcy5TVFQkc2FtcGxlSUQgPT0gc2lkLCBdKSksCiAgYWdlID0gc2FwcGx5KHVuaXF1ZSh0cml0b24uc3MuU1RUJHNhbXBsZUlEKSwgZnVuY3Rpb24oc2lkKSB0cml0b24uc3MuU1RUW3RyaXRvbi5zcy5TVFQkc2FtcGxlSUQgPT0gc2lkLCBdJGFnZVsxXSkKKQoKU1RULnNzLlNUVCA8LSBoaXN0KHNhbXBsZXMuc3MuU1RUJGFnZSwgYnJlYWtzID0gc2VxKG1pbih0aW1lX3BvaW50cyksIG1heCh0aW1lX3BvaW50cyksIGxlbmd0aCA9IGxlbmd0aCh0aW1lX3BvaW50cykgKyAxKSwgcGxvdCA9IEZBTFNFKSRjb3VudApTVFQuc3MuU1RUW1NUVC5zcy5TVFQgPT0gMF0gPC0gMSAgIyBBdm9pZCBkaXZpc2lvbiBieSB6ZXJvCgpPVFQuc3MuU1RUIDwtIHNhcHBseSh0aW1lX3BvaW50cywgZnVuY3Rpb24odGkpCiAgc3VtKGFicyh0cml0b24uc3MuU1RUJGFnZV9ydW5pZiAtIHRpKSA8PSBkaWZmKHRpbWVfcG9pbnRzKVsxXSAvIDIsIG5hLnJtID0gVFJVRSkpCgojIFJlY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgaG9sZXMgdGhyb3VnaCB0aW1lIChIVFQpIGFmdGVyIHN1YnNhbXBsaW5nCkhvbGVNaW5BZ2Uuc3MuU1RUIDwtIHNhcHBseSh1bmlxdWUodHJpdG9uLnNzLlNUVCRob2xlSUQpLCBmdW5jdGlvbihob2xlSUQpCiAgbWluKHRyaXRvbi5zcy5TVFRbdHJpdG9uLnNzLlNUVCRob2xlSUQgPT0gaG9sZUlELCAiYWdlX3J1bmlmIl0pKQpIb2xlTWF4QWdlLnNzLlNUVCA8LSBzYXBwbHkodW5pcXVlKHRyaXRvbi5zcy5TVFQkaG9sZUlEKSwgZnVuY3Rpb24oaG9sZUlEKQogIG1heCh0cml0b24uc3MuU1RUW3RyaXRvbi5zcy5TVFQkaG9sZUlEID09IGhvbGVJRCwgImFnZV9ydW5pZiJdKSkKSFRULnNzLlNUVCA8LSBzYXBwbHkodGltZV9wb2ludHMsIGZ1bmN0aW9uKHRpKQogIGxlbmd0aCh3aGljaChyb3VuZChIb2xlTWluQWdlLnNzLlNUVCwgMikgPD0gdGkgJiByb3VuZChIb2xlTWF4QWdlLnNzLlNUVCwgMikgPj0gdGkpKSkKYGBgCgpgYGB7ciBmaWcuYXNwPTAuNCwgZmlnLndpZHRoPTEyfQpwYXIobWZyb3cgPSBjKDEsIDIpKQoKIyBQbG90IHNhbXBsZXMgcGVyIGhvbGUgdGhyb3VnaCB0aW1lIGJlZm9yZSBhbmQgYWZ0ZXIgc3Vic2FtcGxpbmcKcGxvdChsb2Vzcy5zbW9vdGgodGltZV9wb2ludHMsIFNUVCAvIEhUVCwgc3BhbiA9IDAuMDUpLCB0eXBlID0gImwiLCBsd2QgPSAyLCBjb2wgPSAiZG9kZ2VyYmx1ZTQiLAogICAgIHlsaW0gPSBjKDAuMDEsIDIuNSksIG1haW4gPSAiU2FtcGxlcyBwZXIgSG9sZSBUaHJvdWdoIFRpbWUiLAogICAgIHhsYWIgPSAiVGltZSAoTWEpIiwgeWxhYiA9ICJTYW1wbGVzIHBlciBIb2xlIikKcG9pbnRzKHRpbWVfcG9pbnRzLCBTVFQgLyBIVFQsIHBjaCA9IDE5LCBjZXggPSAwLjUsIGNvbCA9IGFscGhhKCJkb2RnZXJibHVlNCIsIDAuMykpCmxpbmVzKGxvZXNzLnNtb290aCh0aW1lX3BvaW50cywgU1RULnNzLlNUVCAvIEhUVC5zcy5TVFQsIHNwYW4gPSAwLjA1KSwgbHdkID0gMiwgY29sID0gInBhbGVncmVlbjQiKQpwb2ludHModGltZV9wb2ludHMsIFNUVC5zcy5TVFQgLyBIVFQuc3MuU1RULCBwY2ggPSAxOSwgY2V4ID0gMC41LCBjb2wgPSBhbHBoYSgicGFsZWdyZWVuNCIsIDAuMykpCgojIFBsb3QgbnVtYmVyIG9mIGhvbGVzIHRocm91Z2ggdGltZSBiZWZvcmUgYW5kIGFmdGVyIHN1YnNhbXBsaW5nCnBsb3QodGltZV9wb2ludHMsIEhUVCwgdHlwZSA9ICJsIiwgY29sID0gImRvZGdlcmJsdWU0IiwgbWFpbiA9ICJOdW1iZXIgb2YgSG9sZXMgVGhyb3VnaCBUaW1lIiwKICAgICB4bGFiID0gIlRpbWUgKE1hKSIsIHlsYWIgPSAiTnVtYmVyIG9mIEhvbGVzIikKcG9pbnRzKHRpbWVfcG9pbnRzLCBIVFQsIHBjaCA9IDE5LCBjb2wgPSAiZG9kZ2VyYmx1ZTQiLCBjZXggPSAwLjUpCmxpbmVzKHRpbWVfcG9pbnRzLCBIVFQuc3MuU1RULCBjb2wgPSAicGFsZWdyZWVuNCIpCnBvaW50cyh0aW1lX3BvaW50cywgSFRULnNzLlNUVCwgcGNoID0gMTksIGNleCA9IDAuNSwgY29sID0gInBhbGVncmVlbjQiKQpgYGAKCgpgYGB7ciBmaWcuYXNwPTAuNSwgZmlnLndpZHRoPTEyfQpwYXIobWZyb3cgPSBjKDEsIDIpLCBtYXIgPSBjKDQsIDQsIDMsIDQpICsgMC4xKQoKIyBQbG90IHNhbXBsZXMgdGhyb3VnaCB0aW1lIGJlZm9yZSBhbmQgYWZ0ZXIgc3Vic2FtcGxpbmcKcGxvdChsb2Vzcy5zbW9vdGgodGltZV9wb2ludHMsIFNUVCwgc3BhbiA9IDAuMiksIHR5cGUgPSAibCIsIGx3ZCA9IDEsIGNvbCA9ICJkb2RnZXJibHVlNCIsIGxvZz0ieSIsIHlsaW09YygxMCwxMDAwKSwKICAgICBtYWluID0gIlNhbXBsZXMgVGhyb3VnaCBUaW1lIGFmdGVyIFN1YnNhbXBsaW5nIiwgeGxpbSA9IHJldihyYW5nZShyYW5nZSh0aW1lX3BvaW50cykpKSwgeGxhYiA9ICJUaW1lIChNYSkiLCB5bGFiID0gIk51bWJlciBvZiBTZWRpbWVudCBTYW1wbGVzIikKcG9pbnRzKHRpbWVfcG9pbnRzLCBTVFQsIHBjaCA9IDE5LCBjZXggPSAwLjUsIGNvbCA9IGFscGhhKCJkb2RnZXJibHVlNCIsIDAuMykpCmxpbmVzKGxvZXNzLnNtb290aCh0aW1lX3BvaW50cywgU1RULnNzLlNUVCwgc3BhbiA9IDAuMiksIGx3ZCA9IDMsIGNvbCA9ICJwYWxlZ3JlZW40IikKcG9pbnRzKHRpbWVfcG9pbnRzLCBTVFQuc3MuU1RULCBwY2ggPSAxOSwgY2V4ID0gMC41LCBjb2wgPSBhbHBoYSgicGFsZWdyZWVuNCIsIDAuMykpCgojIFBsb3Qgb2NjdXJyZW5jZXMgdGhyb3VnaCB0aW1lIGJlZm9yZSBhbmQgYWZ0ZXIgc3Vic2FtcGxpbmcKcGxvdChsb2Vzcy5zbW9vdGgodGltZV9wb2ludHMsIE9UVCwgc3BhbiA9IDAuMiksIHR5cGUgPSAibCIsIGx3ZCA9IDEsIGNvbCA9ICJkb2RnZXJibHVlNCIsIGxvZyA9ICJ5IiwKICAgICBtYWluID0gIk9jY3VycmVuY2VzIFRocm91Z2ggVGltZSBhZnRlciBTdWJzYW1wbGluZyIsIHhsaW0gPSByZXYocmFuZ2UocmFuZ2UodGltZV9wb2ludHMpKSksIHhsYWIgPSAiVGltZSAoTWEpIiwgeWxhYiA9IHBhc3RlMCgiTnVtYmVyIG9mIG9jY3VycmVuY2VzIikpCnBvaW50cyh0aW1lX3BvaW50cywgT1RULCBwY2ggPSAxOSwgY2V4ID0gMC41LCBjb2wgPSBhbHBoYSgiZG9kZ2VyYmx1ZTQiLCAwLjMpKQpsaW5lcyhsb2Vzcy5zbW9vdGgodGltZV9wb2ludHMsIE9UVC5zcy5TVFQsIHNwYW4gPSAwLjEpLCBsd2QgPSAzLCBjb2wgPSAicGFsZWdyZWVuNCIpCnBvaW50cyh0aW1lX3BvaW50cywgT1RULnNzLlNUVCwgcGNoID0gMTksIGNleCA9IDAuNSwgY29sID0gYWxwaGEoInBhbGVncmVlbjQiLCAwLjMpKQpwYXIobmV3ID0gVFJVRSkKcGxvdCh0aW1lX3BvaW50cywgZXhwZXJ0TFRULCB0eXBlID0gImwiLCBjb2wgPSAib3JjaGlkNCIsIGx3ZCA9IDMsIHhsaW0gPSByZXYocmFuZ2UocmFuZ2UodGltZV9wb2ludHMpKSksCiAgICAgYXhlcyA9IEZBTFNFLCB5bGltPWMoMTAsMTAwMDApLCB4bGFiID0gIiIsIHlsYWIgPSAiIiwgbG9nID0gInkiKQpheGlzKDQsIGNvbCA9ICJvcmNoaWQ0IiwgY29sLmF4aXMgPSAib3JjaGlkNCIsIGxhcyA9IDEsIGxhYmVscyA9IGMoIjEwIiwiMjAiLCI1MCIsIjEwMCIpLCBhdCA9IGMoMTAsMjAsNTAsMTAwKSkKbXRleHQoIk51bWJlciBvZiBsaW5lYWdlcyIsIHNpZGUgPSA0LCBsaW5lID0gMywgYWRqID0gMC4wMiwgY29sID0gIm9yY2hpZDQiKQoKcGRmKCJJbWFnZXMvU1RUX3N1YnNhbXBsaW5nLnBkZiIsIHdpZHRoID0gMi44LCBoZWlnaHQgPSAyLjgpCnBhcihtYXIgPSBjKDMsIDMsIDAuNSwgMC41KSArIDAuMSwgbWdwID0gYygyLjEsIDAuNywgMCkpCiMgUGxvdCBzYW1wbGVzIHRocm91Z2ggdGltZSBiZWZvcmUgYW5kIGFmdGVyIHN1YnNhbXBsaW5nCnBsb3QobG9lc3Muc21vb3RoKHRpbWVfcG9pbnRzLCBTVFQsIHNwYW4gPSAwLjIpLCB0eXBlID0gImwiLCBsd2QgPSAxLCBjb2wgPSAiZG9kZ2VyYmx1ZTQiLCBsb2c9InkiLCB5bGltPWMoMTAsMTAwMCksCiAgICAgbWFpbiA9ICIiLCB4YXh0ID0gIm4iLCB5YXh0ID0gIm4iLCB4bGltID0gcmV2KHJhbmdlKHJhbmdlKHRpbWVfcG9pbnRzKSkpLCB4bGFiID0gIlRpbWUgKE1hKSIsIHlsYWIgPSAiTnVtYmVyIG9mIFNlZGltZW50IFNhbXBsZXMiKQpwb2ludHModGltZV9wb2ludHMsIFNUVCwgcGNoID0gMTksIGNleCA9IDAuMywgY29sID0gYWxwaGEoImRvZGdlcmJsdWU0IiwgMC4zKSkKbGluZXMobG9lc3Muc21vb3RoKHRpbWVfcG9pbnRzLCBTVFQuc3MuU1RULCBzcGFuID0gMC4yKSwgbHdkID0gMiwgY29sID0gInBhbGVncmVlbjQiKQpwb2ludHModGltZV9wb2ludHMsIFNUVC5zcy5TVFQsIHBjaCA9IDE5LCBjZXggPSAwLjMsIGNvbCA9IGFscGhhKCJwYWxlZ3JlZW40IiwgMC4zKSkKYXhpcygxLCBhdCA9IHByZXR0eShyYW5nZSh0aW1lX3BvaW50cyksIG4gPSA0KSkKYXhpcygyLCBhdCA9IGMoMTAsIDUwLCAyMDAsIDEwMDApKQpkZXYub2ZmKCkKCnBkZigiSW1hZ2VzL09UVF9zdWJzYW1wbGluZy5wZGYiLCB3aWR0aCA9IDMuMiwgaGVpZ2h0ID0gMi43KQpwYXIobWFyID0gYygzLCAzLCAwLjUsIDMuNSkgKyAwLjEsIG1ncCA9IGMoMi4xLCAwLjcsIDApKQojIFBsb3Qgb2NjdXJyZW5jZXMgdGhyb3VnaCB0aW1lIGJlZm9yZSBhbmQgYWZ0ZXIgc3Vic2FtcGxpbmcKcGxvdChsb2Vzcy5zbW9vdGgodGltZV9wb2ludHMsIE9UVCwgc3BhbiA9IDAuMiksIHR5cGUgPSAibCIsIGx3ZCA9IDEsIGNvbCA9ICJkb2RnZXJibHVlNCIsIGxvZyA9ICJ5IiwKICAgICBtYWluID0gIiIsIHhheHQgPSAibiIsIHlheHQgPSAibiIsIHhsaW0gPSByZXYocmFuZ2UocmFuZ2UodGltZV9wb2ludHMpKSksIHhsYWIgPSAiVGltZSAoTWEpIiwgeWxhYiA9IHBhc3RlMCgiTnVtYmVyIG9mIG9jY3VycmVuY2VzIikpCnBvaW50cyh0aW1lX3BvaW50cywgT1RULCBwY2ggPSAxOSwgY2V4ID0gMC4zLCBjb2wgPSBhbHBoYSgiZG9kZ2VyYmx1ZTQiLCAwLjMpKQpsaW5lcyhsb2Vzcy5zbW9vdGgodGltZV9wb2ludHMsIE9UVC5zcy5TVFQsIHNwYW4gPSAwLjEpLCBsd2QgPSAyLCBjb2wgPSAicGFsZWdyZWVuNCIpCnBvaW50cyh0aW1lX3BvaW50cywgT1RULnNzLlNUVCwgcGNoID0gMTksIGNleCA9IDAuMywgY29sID0gYWxwaGEoInBhbGVncmVlbjQiLCAwLjMpKQpheGlzKDEsIGF0ID0gcHJldHR5KHJhbmdlKHRpbWVfcG9pbnRzKSwgbiA9IDQpKQpheGlzKDIsIGF0ID0gYygxMDAsIDMwMCwgMTAwMCwgNTAwMCkpCnBhcihuZXcgPSBUUlVFKQpwbG90KHRpbWVfcG9pbnRzLCBleHBlcnRMVFQsIHR5cGUgPSAibCIsIGNvbCA9ICJvcmNoaWQ0IiwgbHdkID0gMiwgeGxpbSA9IHJldihyYW5nZShyYW5nZSh0aW1lX3BvaW50cykpKSwKICAgICBheGVzID0gRkFMU0UsIHlsaW09YygxMCwxMDAwMCksIHhsYWIgPSAiIiwgeWxhYiA9ICIiLCBsb2cgPSAieSIpCmF4aXMoNCwgY29sID0gIm9yY2hpZDQiLCBjb2wuYXhpcyA9ICJvcmNoaWQ0IiwgbGFzID0gMSwgbGFiZWxzID0gYygiMTAiLCIyMCIsIjUwIiwiMTAwIiksIGF0ID0gYygxMCwyMCw1MCwxMDApKQptdGV4dCgiTnVtYmVyIG9mIGxpbmVhZ2VzIiwgc2lkZSA9IDQsIGxpbmUgPSAyLjMsIGFkaiA9IDAsIGNvbCA9ICJvcmNoaWQ0IikKZGV2Lm9mZigpCmBgYAoKVGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBhZnRlciBzdWJzYW1wbGluZyByZWZsZWN0cyB2ZXJ5IHdlbGwgdGhlIG51bWJlciBvZiBsaW5lYWdlcyBkZXNpZ25lZCBieSBleHBlcnRzLgoKYGBge3IgZmlnLmFzcD0wLjQsIGZpZy53aWR0aD0xMn0KSG9sZU5iU2FtcGxlLnNzLlNUVCA8LSBzYXBwbHkobmFtZXMoSG9sZU1heEFnZS5zcy5TVFQpLCBmdW5jdGlvbihob2xlSUQpbGVuZ3RoKHVuaXF1ZSh0cml0b24uc3MuU1RUW3RyaXRvbi5zcy5TVFQkaG9sZUlEID09IGhvbGVJRCwgInNhbXBsZUlEIl0pKSkKSG9sZUR0eVNhbXBsZS5zcy5TVFQgPC0gSG9sZU5iU2FtcGxlLnNzLlNUVC9zYXBwbHkoSG9sZU1heEFnZS5zcy5TVFQtSG9sZU1pbkFnZS5zcy5TVFQsIG1heCwgYT0wLjAwMSkKCmdncGxvdChkYXRhLmZyYW1lKEhvbGVNaW5BZ2U9SG9sZU1pbkFnZSwgSG9sZU1heEFnZT1Ib2xlTWF4QWdlLCBIb2xlRHR5U2FtcGxlPWFzLnZlY3RvcihIb2xlRHR5U2FtcGxlKSkpICsKICBnZW9tX2xpbmVyYW5nZShhZXMoeT1Ib2xlRHR5U2FtcGxlLCB4bWluPUhvbGVNaW5BZ2UsIHhtYXg9SG9sZU1heEFnZSwgY29sPUhvbGVEdHlTYW1wbGUpLCBsd2Q9MC4zKSArCiAgc2NhbGVfY29sb3JfZ3JhZGllbnQobG93ID0gImxpZ2h0Ymx1ZSIsIGhpZ2ggPSAiZG9kZ2VyYmx1ZTQiLCBuYW1lID0gIlNhbXBsZSBkZW5zaXR5IiwgdHJhbnMgPSAibG9nMTAiKSArCiAgc2NhbGVfeV9sb2cxMCgiU2FtcGxlIGRlbnNpdHkiLCBicmVha3M9YygxLDEwMCwxMDAwMCksIGxpbT1jKDFlLTIsIDI1MDAwKSkKCmdncGxvdChkYXRhLmZyYW1lKEhvbGVNaW5BZ2U9SG9sZU1pbkFnZS5zcy5TVFQsIEhvbGVNYXhBZ2U9SG9sZU1heEFnZS5zcy5TVFQsIEhvbGVEdHlTYW1wbGU9YXMudmVjdG9yKEhvbGVEdHlTYW1wbGUuc3MuU1RUKSkpICsKICBnZW9tX2xpbmVyYW5nZShhZXMoeT1Ib2xlRHR5U2FtcGxlLCB4bWluPUhvbGVNaW5BZ2UsIHhtYXg9SG9sZU1heEFnZSwgY29sPUhvbGVEdHlTYW1wbGUpLCBsd2Q9MC4zKSArCiAgc2NhbGVfY29sb3JfZ3JhZGllbnQobG93ID0gImRhcmtvbGl2ZWdyZWVuMyIsIGhpZ2ggPSAicGFsZWdyZWVuNCIsIG5hbWUgPSAiU2FtcGxlIGRlbnNpdHkiLCB0cmFucyA9ICJsb2cxMCIpICsKICBzY2FsZV95X2xvZzEwKCJTYW1wbGUgZGVuc2l0eSIsIGJyZWFrcz1jKDEsMTAwLDEwMDAwKSwgbGltPWMoMWUtMiwgMjUwMDApKQpgYGAKCiMjIENoZWNrIHNwYXRpYWwgYmlhc2VzCgpgYGB7ciBmaWcuYXNwPTAuNSwgZmlnLndpZHRoPTEyfQplbXBpcmljYWxMVFQuc3MuU1RUIDwtIHNhcHBseSh0aW1lX3BvaW50cywgZnVuY3Rpb24odGkpbGVuZ3RoKHVuaXF1ZSh0cml0b24uc3MuU1RUW2Ficyh0cml0b24uc3MuU1RUJGFnZV9ydW5pZiAtIHRpKSA8PSBkaWZmKHRpbWVfcG9pbnRzKVsxXS8yLF0kc3BlY2llcykpKQpkdHlfbGF0X29icy5zcy5TVFQgPC0gZGVuc2l0eSh0cml0b24uc3MuU1RUJHBhbC5sYXQsIGFkanVzdD0wLjUsIGZyb209LTkwLCB0bz05MCwgY3V0PVQsIG5hLnJtPVQpCmR0eV9sb25nX29icy5zcy5TVFQgPC0gZGVuc2l0eSh0cml0b24uc3MuU1RUJHBhbC5sb25nLCBhZGp1c3Q9MC41LCBmcm9tPS0xODAsIHRvPTE4MCwgY3V0PVQsIG5hLnJtPVQpCgojIFRpbWUKcGFyKG1mY29sPWMoMiwzKSkKcGxvdCh0aW1lX3BvaW50cywgT1RUL2VtcGlyaWNhbExUVCwgbG9nPSJ5IiwgeWxpbT1jKDEsMTAwMCksIHR5cGU9ImwiLCBjb2w9ImJyb3duIiwgbWFpbj0iU2FtcGxpbmcgcmF0ZSB0aHJvdWdoIHRpbWUiLCB4bGFiPSJBZ2UgKE15cnMpIiwgeWxhYj0iT2NjdXJyZW5jZXMgcGVyIGxpbmVhZ2UiKQpwb2ludHModGltZV9wb2ludHMsIE9UVC9lbXBpcmljYWxMVFQsIHBjaD0xOSwgY2V4PTAuNSwgY29sPSJicm93biIpCnBsb3QodGltZV9wb2ludHMsIE9UVC5zcy5TVFQvZW1waXJpY2FsTFRULnNzLlNUVCwgbG9nPSJ5IiwgeWxpbT1jKDEsMTAwMCksIHR5cGU9ImwiLCBjb2w9ImNvcmFsNCIsIG1haW49cGFzdGUwKCJTYW1wbGluZyByYXRlIHRocm91Z2ggdGltZSB3aXRoICIsIG5yb3codHJpdG9uLnNzLlNUVCkgLCIgZm9zc2lscyIpLCB4bGFiPSJBZ2UgKE15cnMpIiwgeWxhYj0iT2NjdXJyZW5jZXMgcGVyIGxpbmVhZ2UiKQpwb2ludHModGltZV9wb2ludHMsIE9UVC5zcy5TVFQvZW1waXJpY2FsTFRULnNzLlNUVCwgcGNoPTE5LCBjZXg9MC41LCBjb2w9ImNvcmFsNCIpCgojIExhdGl0dWRlCmhpc3QodW5pZm9ybV9zYW1wbGVzJGxhdCwgYnJlYWtzPTUwLCBwcm9iPVQsIHlsaW09YygwLDAuMDIpLCBtYWluPSJSYXcgbGF0aXR1ZGluYWwgZGlzdHJpYnV0aW9uIiwgeGxhYj0iTGF0aXR1ZGUiLCB5bGFiPSJGb3NzaWwgc2FtcGxpbmcgZGVuc2l0eSIpCmxpbmVzKGR0eV9sYXRfcmVmLCBsd2Q9MikKaGlzdCh0cml0b24kcGFsLmxhdCwgYnJlYWtzPTUwLCBwcm9iPVQsIGFkZD1ULCBjb2w9YWxwaGEoInJlZCIsIDAuMSkpCmxpbmVzKGR0eV9sYXRfb2JzLCBsd2Q9MiwgY29sPSJyZWQiKQp0ZXh0KHg9NzAsIHk9MC4wMTUsIHBhc3RlKCJXRCA9Iiwgc2lnbmlmKHRyYW5zcG9ydDo6d2Fzc2Vyc3RlaW4xZChkdHlfbGF0X3JlZiR5LCBkdHlfbGF0X29icyR5KSwgMikpKQpwbG90KGR0eV9sYXRfcmVmLCB0eXBlPSJsIiwgbHdkPTIsIHlsaW09YygwLDAuMDIpLCBtYWluPXBhc3RlMCgiTGF0aXR1ZGluYWwgZGlzdHJpYnV0aW9uIHdpdGggIiwgbnJvdyh0cml0b24uc3MuU1RUKSAsIiBmb3NzaWxzIiksIHhsYWI9IkxhdGl0dWRlIiwgeWxhYj0iRm9zc2lsIHNhbXBsaW5nIGRlbnNpdHkiKQpsaW5lcyhkdHlfbGF0X29icy5zcy5TVFQsIGx3ZD0yLCBjb2w9ImNvcmFsNCIpCnRleHQoeD03MCwgeT0wLjAxNSwgcGFzdGUoIldEID0iLCBzaWduaWYodHJhbnNwb3J0Ojp3YXNzZXJzdGVpbjFkKGR0eV9sYXRfcmVmJHksIGR0eV9sYXRfb2JzLnNzLlNUVCR5KSwgMikpKQoKIyBMb25naXR1ZGUKaGlzdCh1bmlmb3JtX3NhbXBsZXMkbG9uZywgYnJlYWtzPTUwLCBwcm9iPVQsIHlsaW09YygwLDAuMDIpLCBtYWluPSJSYXcgbG9uZ2l0dWRpbmFsIGRpc3RyaWJ1dGlvbiIsIHhsYWI9IkxvbmdpdHVkZSIsIHlsYWI9IkZvc3NpbCBzYW1wbGluZyBkZW5zaXR5IikKbGluZXMoZHR5X2xvbmdfcmVmLCBsd2Q9MikKaGlzdCh0cml0b24kcGFsLmxvbmcsIGJyZWFrcz01MCwgcHJvYj1ULCBhZGQ9VCwgY29sPWFscGhhKCJyZWQiLCAwLjEpKQpsaW5lcyhkdHlfbG9uZ19vYnMsIGx3ZD0yLCBjb2w9InJlZCIpCnRleHQoeD0xMjAsIHk9MC4wMTUsIHBhc3RlKCJXRCA9Iiwgc2lnbmlmKHRyYW5zcG9ydDo6d2Fzc2Vyc3RlaW4xZChkdHlfbG9uZ19yZWYkeSwgZHR5X2xvbmdfb2JzJHkpLCAyKSkpCnBsb3QoZHR5X2xvbmdfcmVmLCB0eXBlPSJsIiwgbHdkPTIsIHlsaW09YygwLDAuMDIpLCBtYWluPXBhc3RlMCgiTG9uZ2l0dWRpbmFsIGRpc3RyaWJ1dGlvbiB3aXRoICIsIG5yb3codHJpdG9uLnNzLlNUVCkgLCIgZm9zc2lscyIpLCB4bGFiPSJMb25naXR1ZGUiLCB5bGFiPSJGb3NzaWwgc2FtcGxpbmcgZGVuc2l0eSIpCmxpbmVzKGR0eV9sb25nX29icy5zcy5TVFQsIGx3ZD0yLCBjb2w9ImNvcmFsNCIpCnRleHQoeD0xMjAsIHk9MC4wMTUsIHBhc3RlKCJXRCA9Iiwgc2lnbmlmKHRyYW5zcG9ydDo6d2Fzc2Vyc3RlaW4xZChkdHlfbG9uZ19yZWYkeSwgZHR5X2xvbmdfb2JzLnNzLlNUVCR5KSwgMikpKQpgYGAKCiMjIENvbXBhcmUgdG8gc2ltdWxhdGVkIGhvbW9nZW5lb3VzIHNhbXBsaW5nCgpgYGB7cn0KZm9zc2lsX3NhbXBsaW5nIDwtIGFzLmRhdGEuZnJhbWUodChzYXBwbHkodW5pcXVlKHRyaXRvbiRzcGVjaWVzKSwgZnVuY3Rpb24oc3Ape3RyaXRvbl9zcGkgPC0gdHJpdG9uW3RyaXRvbiRzcGVjaWVzPT1zcCxdOyByZXR1cm4oYyhuYl9mb3NzaWxzPW5yb3codHJpdG9uX3NwaSksIGR1cmF0aW9uPXRyaXRvbl9zcGkkU3BlY2lhdGlvblsxXS10cml0b25fc3BpJEV4dGluY3Rpb25bMV0pKX0pKSkKZm9zc2lsX3NhbXBsaW5nLnNzLlNUVCA8LSBhcy5kYXRhLmZyYW1lKHQoc2FwcGx5KHVuaXF1ZSh0cml0b24uc3MuU1RUJHNwZWNpZXMpLCBmdW5jdGlvbihzcCl7dHJpdG9uX3NwaSA8LSB0cml0b24uc3MuU1RUW3RyaXRvbi5zcy5TVFQkc3BlY2llcz09c3AsXTsgcmV0dXJuKGMobmJfZm9zc2lscz1ucm93KHRyaXRvbl9zcGkpLCBkdXJhdGlvbj10cml0b25fc3BpJFNwZWNpYXRpb25bMV0tdHJpdG9uX3NwaSRFeHRpbmN0aW9uWzFdKSl9KSkpCmBgYAoKYGBge3IgZmlnLmFzcD0wLjYsIGZpZy53aWR0aD04LCB3YXJuaW5nPUZBTFNFfQpwc2kgPC0gc3VtKGZvc3NpbF9zYW1wbGluZyRuYl9mb3NzaWxzKS9zdW0oZm9zc2lsX3NhbXBsaW5nJGR1cmF0aW9uKQpwc2kuc3MuU1RUIDwtIHN1bShmb3NzaWxfc2FtcGxpbmcuc3MuU1RUJG5iX2Zvc3NpbHMpL3N1bShmb3NzaWxfc2FtcGxpbmcuc3MuU1RUJGR1cmF0aW9uKQpmb3NzaWxfc2FtcGxpbmcuZGYgPC0gZGF0YS5mcmFtZShkdXJhdGlvbj1jKGZvc3NpbF9zYW1wbGluZyRkdXJhdGlvbiwgZm9zc2lsX3NhbXBsaW5nLnNzLlNUVCRkdXJhdGlvbiwgZm9zc2lsX3NhbXBsaW5nJGR1cmF0aW9uLCBmb3NzaWxfc2FtcGxpbmcuc3MuU1RUJGR1cmF0aW9uKSwgbmIuZm9zc2lscz1jKGZvc3NpbF9zYW1wbGluZyRuYl9mb3NzaWxzLCBmb3NzaWxfc2FtcGxpbmcuc3MuU1RUJG5iX2Zvc3NpbHMsIHJwb2lzKGxlbmd0aChmb3NzaWxfc2FtcGxpbmckZHVyYXRpb24pLCBmb3NzaWxfc2FtcGxpbmckZHVyYXRpb24qcHNpKSwgcnBvaXMobGVuZ3RoKGZvc3NpbF9zYW1wbGluZy5zcy5TVFQkZHVyYXRpb24pLCBmb3NzaWxfc2FtcGxpbmcuc3MuU1RUJGR1cmF0aW9uKnBzaS5zcy5TVFQpKSwgb3JpZ2luPWMocmVwKCJUcml0b24iLCBucm93KGZvc3NpbF9zYW1wbGluZykpLCByZXAoIlN1YnNhbXBsZWQgVHJpdG9uIiwgbnJvdyhmb3NzaWxfc2FtcGxpbmcuc3MuU1RUKSksIHJlcCgiU2ltdWxhdGlvbiAoflRyaXRvbikiLCBucm93KGZvc3NpbF9zYW1wbGluZykpLCByZXAoIlNpbXVsYXRpb24gKH5zdWJzYW1wbGVkIFRyaXRvbikiLCBucm93KGZvc3NpbF9zYW1wbGluZy5zcy5TVFQpKSkpCgpwIDwtIGdncGxvdChmb3NzaWxfc2FtcGxpbmcuZGYsIGFlcyh4PWR1cmF0aW9uLCB5PW5iLmZvc3NpbHMsIGNvbD1vcmlnaW4sIGFscGhhPW9yaWdpbiwgc2hhcGU9b3JpZ2luKSkgKwogIGdlb21fcG9pbnQoY2V4PTIpICsKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShsaW1pdHMgPSBjKCJTaW11bGF0aW9uICh+VHJpdG9uKSIsICJUcml0b24iLCAiU2ltdWxhdGlvbiAofnN1YnNhbXBsZWQgVHJpdG9uKSIsICJTdWJzYW1wbGVkIFRyaXRvbiIpLAogICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBjKCIjMDQwQTNEIiwgICJkb2RnZXJibHVlNCIsICIjMDIyQjBCIiwgInBhbGVncmVlbjQiKSkgKwogIHNjYWxlX2FscGhhX21hbnVhbChsaW1pdHMgPSBjKCJTaW11bGF0aW9uICh+VHJpdG9uKSIsICJUcml0b24iLCAiU2ltdWxhdGlvbiAofnN1YnNhbXBsZWQgVHJpdG9uKSIsICJTdWJzYW1wbGVkIFRyaXRvbiIpLAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoMC40LCAwLjIsIDAuNCwgMC4yKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChsaW1pdHMgPSBjKCJTaW11bGF0aW9uICh+VHJpdG9uKSIsICJUcml0b24iLCAiU2ltdWxhdGlvbiAofnN1YnNhbXBsZWQgVHJpdG9uKSIsICJTdWJzYW1wbGVkIFRyaXRvbiIpLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKDE1LCAxNiwgMTUsIDE2KSkgKwogIHNjYWxlX3hfY29udGludW91cyh0cmFucyA9ICJsb2cxcCIsIG5hbWU9IlNwZWNpZXMgbGlmZXRpbWUgKE15cikiLCBicmVha3MgPSBjKDAsMSwxMCw1MCkpICsKICBzY2FsZV95X2xvZzEwKG5hbWU9Ik51bWJlciBvZiBmb3NzaWxzIikgKyAKICBndWlkZXMoCiAgICBzaGFwZSA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSA1KSksCiAgICBjb2xvciA9IGd1aWRlX2xlZ2VuZChucm93ID0gMikKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gTkEsIGNvbG9yID0gImdyZXk3MCIpLAogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICByZWN0ID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAKICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSkKICApICsgCiAgZmFjZXRfd3JhcChzYXBwbHkoZ3JlcGwoInNhbXBsZWQiLCBvcmlnaW4pLCBpZmVsc2UsIHllcz0iU3Vic2FtcGxlZCBkYXRhYmFzZSIsIG5vPSJJbml0aWFsIGRhdGFiYXNlIil+LikKCnAgKyAgZ2d0aXRsZSgiT2JzZXJ2ZWQgZm9zc2lsIHNhbXBsaW5nIGNvbXBhcmVkIHRvIGEgaG9tb2dlbmVvdXMgcHJvY2VzcyIpCmdnc2F2ZSgiSW1hZ2VzL0VtcGlyaWNhbF92ZXJzdXNfaG9tb2dlbmVvdXNfc2FtcGxpbmcucGRmIiwgcCwgd2lkdGggPSA1LCBoZWlnaHQgPSAzLjUpCmBgYAoKIyBTYXZlIG9iamVjdHMKCmBgYHtyfQp3cml0ZS5jc3YodHJpdG9uLnNzLlNUVCwgcGFzdGUwKCIuLi8uLi8zLURhdGFfcHJvY2Vzc2VkL1RyaXRvbl9vY2N1cnJlbmNlcy9Ucml0b25EQl9zdWJzYW1wbGVkX1NUVF8iLCAgbnJvdyh0cml0b24uc3MuU1RUKSwgImZvc3MuY3N2IikpCgp3cml0ZS5jc3YodGltZV9wb2ludHMsICIuLi8uLi8zLURhdGFfcHJvY2Vzc2VkL1RyaXRvbl9vY2N1cnJlbmNlcy90aW1lX3BvaW50cy5jc3YiLCByb3cubmFtZXM9RikKd3JpdGUuY3N2KE9UVCwgIi4uLy4uLzMtRGF0YV9wcm9jZXNzZWQvVHJpdG9uX29jY3VycmVuY2VzL09UVC5jc3YiLCByb3cubmFtZXM9RikKd3JpdGUuY3N2KGV4cGVydExUVCwgIi4uLy4uLzMtRGF0YV9wcm9jZXNzZWQvVHJpdG9uX29jY3VycmVuY2VzL2V4cGVydExUVC5jc3YiLCByb3cubmFtZXM9RikKd3JpdGUuY3N2KGVtcGlyaWNhbExUVCwgIi4uLy4uLzMtRGF0YV9wcm9jZXNzZWQvVHJpdG9uX29jY3VycmVuY2VzL2VtcGlyaWNhbExUVC5jc3YiLCByb3cubmFtZXM9RikKd3JpdGUuY3N2KE9UVC5zcy5TVFQsIHBhc3RlMCgiLi4vLi4vMy1EYXRhX3Byb2Nlc3NlZC9Ucml0b25fb2NjdXJyZW5jZXMvT1RUX3N1YnNhbXBsZWRfU1RUXyIsICBucm93KHRyaXRvbi5zcy5TVFQpLCAiZm9zcy5jc3YiKSwgcm93Lm5hbWVzPUYpCndyaXRlLmNzdihlbXBpcmljYWxMVFQuc3MuU1RULCBwYXN0ZTAoIi4uLy4uLzMtRGF0YV9wcm9jZXNzZWQvVHJpdG9uX29jY3VycmVuY2VzL2VtcGlyaWNhbExUVF9zdWJzYW1wbGVkX1NUVF8iLCAgbnJvdyh0cml0b24uc3MuU1RUKSwgImZvc3MuY3N2IiksIHJvdy5uYW1lcz1GKQpgYGAKCmBgYHtyfQojd3JpdGUuY3N2KHRyaXRvbi5zczYsIHBhc3RlMCgiLi4vLi4vMy1EYXRhX3Byb2Nlc3NlZC9Ucml0b25fb2NjdXJyZW5jZXMvVHJpdG9uREJfc3Vic2FtcGxlZF8iLCAgbnJvdyh0cml0b24uc3M2KSwgImZvc3MuY3N2IikpCiN3cml0ZS5jc3YodHJpdG9uLnNzMTUsIHBhc3RlMCgiLi4vLi4vMy1EYXRhX3Byb2Nlc3NlZC9Ucml0b25fb2NjdXJyZW5jZXMvVHJpdG9uREJfc3Vic2FtcGxlZF8iLCAgbnJvdyh0cml0b24uc3MxNSksICJmb3NzLmNzdiIpKQojd3JpdGUuY3N2KHRyaXRvbi5zczIwLCBwYXN0ZTAoIi4uLy4uLzMtRGF0YV9wcm9jZXNzZWQvVHJpdG9uX29jY3VycmVuY2VzL1RyaXRvbkRCX3N1YnNhbXBsZWRfIiwgIG5yb3codHJpdG9uLnNzMjApLCAiZm9zcy5jc3YiKSkKCiN3cml0ZS5jc3YoT1RULnNzNiwgcGFzdGUwKCIuLi8uLi8zLURhdGFfcHJvY2Vzc2VkL1RyaXRvbl9vY2N1cnJlbmNlcy9PVFRfIiwgIG5yb3codHJpdG9uLnNzNiksICJmb3NzLmNzdiIpLCByb3cubmFtZXM9RikKI3dyaXRlLmNzdihlbXBpcmljYWxMVFQuc3M2LCBwYXN0ZTAoIi4uLy4uLzMtRGF0YV9wcm9jZXNzZWQvVHJpdG9uX29jY3VycmVuY2VzL2VtcGlyaWNhbExUVF8iLCAgbnJvdyh0cml0b24uc3M2KSwgImZvc3MuY3N2IiksIHJvdy5uYW1lcz1GKQojd3JpdGUuY3N2KE9UVC5zczE1LCBwYXN0ZTAoIi4uLy4uLzMtRGF0YV9wcm9jZXNzZWQvVHJpdG9uX29jY3VycmVuY2VzL09UVF8iLCAgbnJvdyh0cml0b24uc3MxNSksICJmb3NzLmNzdiIpLCByb3cubmFtZXM9RikKI3dyaXRlLmNzdihlbXBpcmljYWxMVFQuc3MxNSwgcGFzdGUwKCIuLi8uLi8zLURhdGFfcHJvY2Vzc2VkL1RyaXRvbl9vY2N1cnJlbmNlcy9lbXBpcmljYWxMVFRfIiwgIG5yb3codHJpdG9uLnNzMTUpLCAiZm9zcy5jc3YiKSwgcm93Lm5hbWVzPUYpCiN3cml0ZS5jc3YoT1RULnNzMjAsIHBhc3RlMCgiLi4vLi4vMy1EYXRhX3Byb2Nlc3NlZC9Ucml0b25fb2NjdXJyZW5jZXMvT1RUXyIsICBucm93KHRyaXRvbi5zczIwKSwgImZvc3MuY3N2IiksIHJvdy5uYW1lcz1GKQojd3JpdGUuY3N2KGVtcGlyaWNhbExUVC5zczIwLCBwYXN0ZTAoIi4uLy4uLzMtRGF0YV9wcm9jZXNzZWQvVHJpdG9uX29jY3VycmVuY2VzL2VtcGlyaWNhbExUVF8iLCAgbnJvdyh0cml0b24uc3MyMCksICJmb3NzLmNzdiIpLCByb3cubmFtZXM9RikKYGBgCgoK